diff --git a/djblets/datagrid/grids.py b/djblets/datagrid/grids.py
index 336e40213efdf25c2ad39a2684f6784d50cdd38d..53d0d699c113439654ea4b45669b377ba6341b73 100644
--- a/djblets/datagrid/grids.py
+++ b/djblets/datagrid/grids.py
@@ -39,7 +39,6 @@ from django.utils.html import escape, format_html
 from django.utils.safestring import mark_safe
 from django.utils.translation import gettext_lazy as _
 
-from djblets.deprecation import RemovedInDjblets40Warning
 from djblets.template.context import get_default_template_context_processors
 from djblets.util.decorators import cached_property
 from djblets.util.http import get_url_params_except
@@ -1133,17 +1132,8 @@ class DataGrid(object):
         # as well.
         load_state_result = self.load_extra_state(profile)
 
-        if isinstance(load_state_result, list):
-            profile_dirty_fields += load_state_result
-        else:
-            RemovedInDjblets40Warning.warn(
-                '%s.load_extra_state() returned a %s, but must return a '
-                'list of field names to save (or an empty list). This will '
-                'be required in Djblets 4.0.'
-                % (type(self).__name__, type(load_state_result)))
-
-            if load_state_result is True:
-                profile_dirty_fields_all = True
+        assert isinstance(load_state_result, list)
+        profile_dirty_fields += load_state_result
 
         # Now that we have all that, figure out if we need to save new
         # settings back to the profile.
diff --git a/djblets/datagrid/tests.py b/djblets/datagrid/tests.py
index 4ebbce7b000e4b81b0950e985ee8889a74ff9cc9..798773b0f55a1dc9cd99e2f1e1b0de7ee2ac65b8 100644
--- a/djblets/datagrid/tests.py
+++ b/djblets/datagrid/tests.py
@@ -13,7 +13,6 @@ from django.utils.safestring import SafeText
 from djblets.datagrid.grids import (CheckboxColumn, Column, DataGrid,
                                     DateTimeSinceColumn, StatefulColumn,
                                     logger)
-from djblets.deprecation import RemovedInDjblets40Warning
 from djblets.testing.testcases import TestCase
 from djblets.util.dates import get_tz_aware_utcnow
 
@@ -251,64 +250,6 @@ class DataGridTests(kgb.SpyAgency, TestCase):
 
         self.assertSpyNotCalled(my_profile.save)
 
-    def test_load_state_with_load_extra_state_true(self):
-        """Testing DataGrid.load_state with load_extra_state returning True"""
-        class MyProfile(object):
-            def save(self, **kwargs):
-                pass
-
-        class TestDataGrid(GroupDataGrid):
-            def get_user_profile(self):
-                return my_profile
-
-            def load_extra_state(self, profile):
-                return True
-
-        my_profile = MyProfile()
-        self.spy_on(my_profile.save)
-
-        datagrid = TestDataGrid(request=self.request)
-
-        message = (
-            "TestDataGrid.load_extra_state() returned a <class 'bool'>, but "
-            "must return a list of field names to save (or an empty list). "
-            "This will be required in Djblets 4.0."
-        )
-
-        with self.assertWarns(RemovedInDjblets40Warning, message):
-            datagrid.load_state()
-
-        self.assertSpyCalled(my_profile.save)
-
-    def test_load_state_with_load_extra_state_false(self):
-        """Testing DataGrid.load_state with load_extra_state returning False"""
-        class MyProfile(object):
-            def save(self, **kwargs):
-                pass
-
-        class TestDataGrid(GroupDataGrid):
-            def get_user_profile(self):
-                return my_profile
-
-            def load_extra_state(self, profile):
-                return False
-
-        my_profile = MyProfile()
-        self.spy_on(my_profile.save)
-
-        datagrid = TestDataGrid(request=self.request)
-
-        message = (
-            "TestDataGrid.load_extra_state() returned a <class 'bool'>, but "
-            "must return a list of field names to save (or an empty list). "
-            "This will be required in Djblets 4.0."
-        )
-
-        with self.assertWarns(RemovedInDjblets40Warning, message):
-            datagrid.load_state()
-
-        self.assertSpyNotCalled(my_profile.save)
-
     def test_precompute_objects_with_unsortable_column_ascending(self):
         """Testing DataGrid.precompute_objects with improper sort key
         in ascending order
diff --git a/djblets/deprecation.py b/djblets/deprecation.py
index a34d516757d7b7fcbf25125b3fe049b6256e9377..53e8e6f28ab7d8ecd80b13a2b605747c8dfc981e 100644
--- a/djblets/deprecation.py
+++ b/djblets/deprecation.py
@@ -82,18 +82,6 @@ class BaseRemovedInDjbletsVersionWarning(BaseRemovedInProductVersionWarning):
     product = 'Djblets'
 
 
-class RemovedInDjblets40Warning(BaseRemovedInDjbletsVersionWarning):
-    """Deprecations for features scheduled for removal in Djblets 4.0.
-
-    Note that this class will itself be removed in Djblets 4.0. If you need to
-    check against Djblets deprecation warnings, please see
-    :py:class:`BaseRemovedInDjbletsVersionWarning`. Alternatively, you can use
-    the alias for this class, :py:data:`RemovedInNextDjbletsVersionWarning`.
-    """
-
-    version = '4.0'
-
-
 class RemovedInDjblets50Warning(BaseRemovedInDjbletsVersionWarning):
     """Deprecations for features scheduled for removal in Djblets 5.0.
 
@@ -107,7 +95,7 @@ class RemovedInDjblets50Warning(BaseRemovedInDjbletsVersionWarning):
 
 
 #: An alias for the next release of Djblets where features would be removed.
-RemovedInNextDjbletsVersionWarning = RemovedInDjblets40Warning
+RemovedInNextDjbletsVersionWarning = RemovedInDjblets50Warning
 
 
 def deprecated_arg_value(
diff --git a/djblets/forms/tests/test_list_edit_widget.py b/djblets/forms/tests/test_list_edit_widget.py
index e86f3fdece4ab1bff6ed245a614780d835b9999f..1186fd21cad48019f1e562031898955c2c8b4218 100644
--- a/djblets/forms/tests/test_list_edit_widget.py
+++ b/djblets/forms/tests/test_list_edit_widget.py
@@ -3,7 +3,6 @@
 from django import forms
 from django.utils.datastructures import MultiValueDict
 
-from djblets.deprecation import RemovedInDjblets40Warning
 from djblets.forms.fields import ListEditField
 from djblets.forms.widgets import ListEditWidget
 from djblets.testing.testcases import TestCase
@@ -13,46 +12,11 @@ class ListEditWidgetTests(TestCase):
     """Unit tests for djblets.forms.widgets.ListEditWidget."""
 
     def test_render(self):
-        """Testing ListEditWidget.render with a string of separated values"""
+        """Testing ListEditWidget.render with a list of values"""
         field = forms.CharField(widget=ListEditWidget())
         rendered = field.widget.render(
             name='my_field',
-            value=' foo,  bar , baz ',
-            attrs={
-                'id': 'id_my_field',
-                'class': 'my-value-class',
-            })
-
-        self.assertIn(
-            '<div class="djblets-c-list-edit-widget list-edit-widget"'
-            ' id="id_my_field_container">',
-            rendered)
-        self.assertIn('<input type="text"'
-                      ' name="my_field_value[0]"'
-                      ' value="foo"'
-                      ' class="my-value-class'
-                      ' djblets-c-list-edit-widget__input">',
-                      rendered)
-        self.assertIn('<input type="text"'
-                      ' name="my_field_value[1]"'
-                      ' value="bar"'
-                      ' class="my-value-class'
-                      ' djblets-c-list-edit-widget__input">',
-                      rendered)
-        self.assertIn('<input type="text"'
-                      ' name="my_field_value[2]"'
-                      ' value="baz"'
-                      ' class="my-value-class'
-                      ' djblets-c-list-edit-widget__input">',
-                      rendered)
-
-    def test_render_with_custom_separator(self):
-        """Testing ListEditWidget.render with a string of separated values
-           using a custom separator"""
-        field = forms.CharField(widget=ListEditWidget(sep=';'))
-        rendered = field.widget.render(
-            name='my_field',
-            value=' foo;  bar ; baz ',
+            value=['foo', 'bar', 'baz'],
             attrs={
                 'id': 'id_my_field',
                 'class': 'my-value-class',
@@ -118,7 +82,6 @@ class ListEditWidgetTests(TestCase):
             'my_field_value[0]': 'a@test.com',
             'my_field_value[1]': 'b@test.com',
             'my_field_num_rows': '2',
-            'my_field_use_legacy_behavior': 'false'
         })
 
         self.assertEqual(
@@ -140,43 +103,6 @@ class ListEditWidgetTests(TestCase):
                                              'my_field'),
             ['a@test.com', 'b@test.com'])
 
-    def test_value_from_datadict_using_field_name_and_legacy_behavior(self):
-        """Testing ListEditWidget.value_from_datadict when only the field
-        name is given in the data dict and using legacy behavior"""
-        field = ListEditField(widget=ListEditWidget())
-        data = MultiValueDict('')
-        data.update({
-            'my_field': 'a@test.com,b@test.com',
-            'my_field_use_legacy_behavior': 'true'
-        })
-
-        self.assertEqual(
-            field.widget.value_from_datadict(data, MultiValueDict(''),
-                                             'my_field'),
-            'a@test.com,b@test.com')
-        self.assertWarns(RemovedInDjblets40Warning,
-                         ('Passing a string to this widget is deprecated '
-                          'and will be removed in 4.0. Pass a list instead.'))
-
-    def test_value_from_datadict_using_legacy_behavior(self):
-        """Testing ListEditWidget.value_from_datadict using legacy behavior"""
-        field = ListEditField(widget=ListEditWidget())
-        data = MultiValueDict('')
-        data.update({
-            'my_field_value[0]': 'a@test.com',
-            'my_field_value[1]': 'b@test.com',
-            'my_field_num_rows': '2',
-            'my_field_use_legacy_behavior': 'true'
-        })
-
-        self.assertEqual(
-            field.widget.value_from_datadict(data, MultiValueDict(''),
-                                             'my_field'),
-            'a@test.com,b@test.com')
-        self.assertWarns(RemovedInDjblets40Warning,
-                         ('Passing a string to this widget is deprecated '
-                          'and will be removed in 4.0. Pass a list instead.'))
-
     def test_get_context(self):
         """Testing ListEditWidget.get_context"""
         field = ListEditField(widget=ListEditWidget())
diff --git a/djblets/forms/widgets.py b/djblets/forms/widgets.py
index 8f946012496227b35ba130aab62d75a879c71f25..3866e2f1c752fb42b4a2e745b5b493d0f825adf4 100644
--- a/djblets/forms/widgets.py
+++ b/djblets/forms/widgets.py
@@ -15,7 +15,6 @@ from django.utils.translation import gettext as _
 from djblets.conditions import ConditionSet
 from djblets.conditions.errors import (ConditionChoiceNotFoundError,
                                        ConditionOperatorNotFoundError)
-from djblets.deprecation import RemovedInDjblets40Warning
 
 
 class ConditionsWidget(widgets.Widget):
@@ -684,25 +683,8 @@ class ListEditWidget(widgets.Widget):
             django.utils.safestring.SafeText:
             The rendered widget.
         """
-        use_legacy_behavior = 'false'
-
-        # If value is not a list we assume that it is a string and convert it
-        # to a list. This behaviour will be deprecated in the future.
-        if not isinstance(value, list):
-            RemovedInDjblets40Warning.warn(
-                ('Passing a string to this widget is deprecated and will be '
-                 'removed in Djblets 4.0. Pass a list instead.'),
-            )
-            use_legacy_behavior = 'true'
-            value = value or ''
-            value = list(
-                filter(None, (item.strip() for item in value.split(self._sep)))
-            )
-
-        context = self.get_context(name, value, attrs)
-        context['use_legacy_behavior'] = use_legacy_behavior
         return render_to_string(self.template_name,
-                                context)
+                                self.get_context(name, value, attrs))
 
     def get_context(self, name, value, attrs):
         """Return context for the widget.
@@ -781,14 +763,11 @@ class ListEditWidget(widgets.Widget):
             The list of values for the field or a string of separated
             values for legacy behavior.
         """
-        use_legacy_behavior = False
         value_widget = self._value_widget
         values = []
 
         try:
             num_rows = int(data['%s_num_rows' % name])
-            use_legacy_behavior = \
-                (data['%s_use_legacy_behavior' % name] == 'true')
 
             for i in range(num_rows):
                 values.append(
@@ -802,15 +781,6 @@ class ListEditWidget(widgets.Widget):
             # from the special keys that get set when the widget is rendered.
             values = data[name]
 
-        # Return a string of separated values if using legacy behavior.
-        # This will be deprecated in the future.
-        if use_legacy_behavior:
-            RemovedInDjblets40Warning.warn(
-                ('Passing a string to this widget is deprecated and will be '
-                 'removed in Djblets 4.0. Pass a list instead.'),
-            )
-            return self._sep.join(values)
-
         return values
 
     def id_for_label(self, id_):
diff --git a/djblets/integrations/urls.py b/djblets/integrations/urls.py
index 17549a7c9341e7c5e33d264cdb709ee55a275933..43039e6db753400839eb928334a2e0ee2ee3bf3e 100644
--- a/djblets/integrations/urls.py
+++ b/djblets/integrations/urls.py
@@ -6,8 +6,6 @@ from typing import List, Optional, TYPE_CHECKING, Tuple, Type, Union
 
 from django.urls import include, path, re_path
 
-from djblets.deprecation import (RemovedInDjblets40Warning,
-                                 deprecate_non_keyword_only_args)
 from djblets.integrations.views import (BaseIntegrationConfigFormView,
                                         BaseIntegrationListView)
 
@@ -16,7 +14,6 @@ if TYPE_CHECKING:
     from django.urls import _AnyURL
 
 
-@deprecate_non_keyword_only_args(RemovedInDjblets40Warning)
 def build_integration_urlpatterns(
     *,
     list_view_cls: Type[BaseIntegrationListView],
diff --git a/djblets/webapi/managers.py b/djblets/webapi/managers.py
index f8fe47baad0e1abe6e75ecd63a7857225a50db6c..c48a55b5dd439ba6f085af36943b2c6ad31b6f90 100644
--- a/djblets/webapi/managers.py
+++ b/djblets/webapi/managers.py
@@ -8,7 +8,6 @@ from django.db.models import Manager, Q
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
-from djblets.deprecation import RemovedInDjblets40Warning
 from djblets.secrets.token_generators import token_generator_registry
 from djblets.secrets.token_generators.legacy_sha1 import \
     LegacySHA1TokenGenerator
@@ -24,13 +23,14 @@ class WebAPITokenManager(Manager):
 
     def generate_token(self,
                        user,
+                       *,
                        max_attempts=20,
                        note=None,
                        policy={},
                        auto_generated=False,
                        expires=None,
-                       token_generator_id=None,
-                       token_info=None,
+                       token_generator_id,
+                       token_info,
                        **kwargs):
         """Generate a WebAPIToken for a user.
 
@@ -41,6 +41,11 @@ class WebAPITokenManager(Manager):
         :py:class:`~djblets.webapi.errors.WebAPITokenGenerationError` will be
         raised.
 
+        Version Changed:
+            4.0:
+            Made the ``token_generator_id`` and ``token_info`` parameters
+            required.
+
         Version Changed:
             3.0:
             * Added the ``token_generator_id`` and ``token_info`` parameters.
@@ -80,18 +85,16 @@ class WebAPITokenManager(Manager):
                 Version Added:
                     3.0
 
-            token_generator_id (str, optional):
+            token_generator_id (str):
                 The ID of the token generator to use for generating the token.
                 If not set, this will default to :py:class:
                 `djblets.secrets.token_generators.legacy_sha1
                 .LegacySHA1TokenGenerator`'s ID.
 
-                This parameter will be required in Djblets 4.0.
-
                 Version Added:
                     3.0
 
-            token_info (dict, optional):
+            token_info (dict):
                 A dictionary that contains information needed for token
                 generation. If not set, this will default to a dictionary that
                 contains necessary information for the :py:class:
@@ -101,8 +104,6 @@ class WebAPITokenManager(Manager):
                 See :py:mod:`djblets.secrets.token_generators` for further
                 details on what is required here for each token generator.
 
-                This parameter will be required in Djblets 4.0.
-
                 Version Added:
                     3.0
 
@@ -122,22 +123,8 @@ class WebAPITokenManager(Manager):
             KeyError:
                 The ``token_info`` dictionary is missing a required key.
         """
-        if token_generator_id is None:
-            token_generator_id = LegacySHA1TokenGenerator.token_generator_id
-
-            RemovedInDjblets40Warning.warn(
-                'The token_generator_id parameter was not set. This '
-                'parameter will be required in Djblets 4.0.')
-
-        if token_info is None:
-            token_info = {
-                'user': user,
-                'attempt': 0,
-            }
-
-            RemovedInDjblets40Warning.warn(
-                'The token_info parameter was not set. This parameter '
-                'will be required in Djblets 4.0.')
+        assert token_generator_id is not None
+        assert token_info is not None
 
         token_generator = token_generator_registry.get_token_generator(
             token_generator_id)
diff --git a/djblets/webapi/responses.py b/djblets/webapi/responses.py
index 723547505173f9c1e8bac47568eeb61e6e31fa88..bf0d5e132f571fef779e9ac325f91d59ac165599 100644
--- a/djblets/webapi/responses.py
+++ b/djblets/webapi/responses.py
@@ -9,8 +9,6 @@ from django.http import HttpResponse
 from django.utils.encoding import force_str
 from typing_extensions import NotRequired, TypeAlias, TypedDict
 
-from djblets.deprecation import (RemovedInDjblets40Warning,
-                                 deprecate_non_keyword_only_args)
 from djblets.util.http import (get_http_requested_mimetype,
                                get_url_params_except,
                                is_mimetype_a)
@@ -143,7 +141,6 @@ class WebAPIResponse(HttpResponse):
     #:     django.http.HttpRequest
     request: HttpRequest
 
-    @deprecate_non_keyword_only_args(RemovedInDjblets40Warning)
     def __init__(
         self,
         request: HttpRequest,
@@ -418,7 +415,6 @@ class WebAPIResponsePaginated(WebAPIResponse):
     #:     str
     total_results_key: str
 
-    @deprecate_non_keyword_only_args(RemovedInDjblets40Warning)
     def __init__(
         self,
         request: HttpRequest,
@@ -717,7 +713,6 @@ class WebAPIResponseError(WebAPIResponse):
     data can be provided through ``extra_params`` and ``headers``.
     """
 
-    @deprecate_non_keyword_only_args(RemovedInDjblets40Warning)
     def __init__(
         self,
         request: HttpRequest,
diff --git a/djblets/webapi/tests/test_api_token.py b/djblets/webapi/tests/test_api_token.py
index 4f3c2593a576dfefae16d9f5d96ca69ba3a2a848..37458cb0e499c3a7c50a9e3c30ee554a292c3025 100644
--- a/djblets/webapi/tests/test_api_token.py
+++ b/djblets/webapi/tests/test_api_token.py
@@ -8,7 +8,6 @@ from django.contrib.auth.models import User
 from django.db import models
 from django.utils import timezone
 
-from djblets.deprecation import RemovedInDjblets40Warning
 from djblets.secrets.token_generators.legacy_sha1 import \
     LegacySHA1TokenGenerator
 from djblets.secrets.token_generators.vendor_checksum import \
@@ -121,21 +120,10 @@ class WebAPITokenManagerTests(kgb.SpyAgency, TestCase):
         self.spy_on(WebAPIToken.save, call_original=False)
         self.spy_on(timezone.now, op=kgb.SpyOpReturn(timezone.now()))
 
-        webapi_token = WebAPIToken.objects.generate_token(self.user)
-
-        with warnings.catch_warnings(record=True) as w:
-            webapi_token = WebAPIToken.objects.generate_token(self.user)
-
-            # Assert that there was a warning for each of the missing args.
-            self.assertEqual(len(w), 2)
-            self.assertEqual(w[0].category, RemovedInDjblets40Warning)
-            self.assertEqual(str(w[0].message),
-                             'The token_generator_id parameter was not set. '
-                             'This parameter will be required in Djblets 4.0.')
-            self.assertEqual(w[1].category, RemovedInDjblets40Warning)
-            self.assertEqual(str(w[1].message),
-                             'The token_info parameter was not set. '
-                             'This parameter will be required in Djblets 4.0.')
+        webapi_token = WebAPIToken.objects.generate_token(
+            self.user,
+            token_generator_id=self.token_generator_id,
+            token_info=self.token_info)
 
         self.assertEqual(webapi_token.user, self.user)
 
@@ -152,7 +140,7 @@ class WebAPITokenManagerTests(kgb.SpyAgency, TestCase):
         self.assertEqual(webapi_token.note, '')
         self.assertIsNotNone(webapi_token.token)
         self.assertEqual(webapi_token.token_generator_id,
-                         LegacySHA1TokenGenerator.token_generator_id)
+                         self.token_generator_id)
         self.assertFalse(webapi_token.my_field)
 
     def test_generate_token_with_custom_field(self):
diff --git a/djblets/webapi/tests/test_responses.py b/djblets/webapi/tests/test_responses.py
index 16c3c283b72212b008b2d4d0f607b083f43166bd..2abfc69e2b7fc553e0ce87c225bbb984693a2b34 100644
--- a/djblets/webapi/tests/test_responses.py
+++ b/djblets/webapi/tests/test_responses.py
@@ -6,7 +6,6 @@ from django.contrib.auth.models import User
 from django.test.client import RequestFactory
 from django.utils.encoding import force_str
 
-from djblets.deprecation import RemovedInDjblets40Warning
 from djblets.testing.testcases import ExpectedWarning, TestCase
 from djblets.webapi.encoders import BasicAPIEncoder
 from djblets.webapi.errors import INVALID_ATTRIBUTE, INVALID_FORM_DATA
@@ -59,54 +58,6 @@ class WebAPIResponseTests(TestCase):
         self.assertEqual(response.encoder_kwargs, encoder_kwargs)
         self.assertEqual(response.mimetype, 'application/json+test')
 
-    def test_init_with_deprecated_all_args(self):
-        """Testing WebAPIResponse.__init__ with deprecated all-args invocation
-        """
-        request = RequestFactory().get('/')
-        headers = {
-            'Header1': 'value1',
-        }
-        encoders = [BasicAPIEncoder()]
-        encoder_kwargs = {
-            'xxx': 123,
-        }
-
-        message = (
-            'Positional argument(s) "obj", "stat", "api_format", "status", '
-            '"headers", "encoders", "encoder_kwargs", "mimetype", '
-            '"supported_mimetypes" must be passed as keyword arguments when '
-            'calling WebAPIResponse.__init__(). This will be required in '
-            'Djblets 4.0.'
-        )
-
-        with self.assertWarns(RemovedInDjblets40Warning, message):
-            response = WebAPIResponse(
-                request,
-                {
-                    'a': 1,
-                    'b': 2,
-                },
-                'ok',
-                'json',
-                200,
-                headers,
-                encoders,
-                encoder_kwargs,
-                'application/json+test',
-                ['application/json+test'])
-
-        self.assertIs(response.request, request)
-        self.assertEqual(response.api_data, {
-            'a': 1,
-            'b': 2,
-            'stat': 'ok',
-        })
-        self.assertEqual(response.status_code, 200)
-        self.assertEqual(response['Header1'], 'value1')
-        self.assertEqual(response.encoders, encoders)
-        self.assertEqual(response.encoder_kwargs, encoder_kwargs)
-        self.assertEqual(response.mimetype, 'application/json+test')
-
 
 class WebAPIResponsePaginatedTests(TestCase):
     """Unit tests for djblets.webapi.responses.WebAPIResponsePaginated."""
@@ -180,93 +131,6 @@ class WebAPIResponsePaginatedTests(TestCase):
         self.assertEqual(response.encoder_kwargs, encoder_kwargs)
         self.assertEqual(response.mimetype, 'application/json+test')
 
-    def test_init_with_deprecated_all_args(self):
-        """Testing WebAPIResponsePaginated.__init__ with deprecated all-args
-        invocation
-        """
-        def _my_serialize(obj):
-            return obj
-
-        request = self.factory.get('/')
-        headers = {
-            'Header1': 'value1',
-        }
-        encoders = [BasicAPIEncoder()]
-        encoder_kwargs = {
-            'xxx': 123,
-        }
-
-        warning_list: List[ExpectedWarning] = [
-            {
-                'cls': RemovedInDjblets40Warning,
-                'message': (
-                    'Positional argument(s) "queryset", "results_key", '
-                    '"prev_key", "next_key", "total_results_key", '
-                    '"start_param", "max_results_param", "default_start", '
-                    '"default_max_results", "max_results_cap", '
-                    '"serialize_object_func", "extra_data" must be passed '
-                    'as keyword arguments when calling '
-                    'WebAPIResponsePaginated.__init__(). This will be '
-                    'required in Djblets 4.0.'
-                ),
-            },
-            {
-                'cls': RemovedInDjblets40Warning,
-                'message': (
-                    'Positional argument(s) "stat", "api_format", "status", '
-                    '"headers", "encoders", "encoder_kwargs", "mimetype", '
-                    '"supported_mimetypes" must be passed as keyword '
-                    'arguments when calling WebAPIResponse.__init__(). This '
-                    'will be required in Djblets 4.0.'
-                ),
-            },
-        ]
-
-        with self.assertWarnings(warning_list):
-            response = WebAPIResponsePaginated(
-                request,
-                User.objects.all(),
-                'my_results',
-                'my_prev',
-                'my_next',
-                'my_total_results',
-                'my-start',
-                'my-max-results',
-                10,
-                100,
-                500,
-                _my_serialize,
-                {
-                    'extra1': 'value1',
-                },
-                'ok',
-                'json',
-                200,
-                headers,
-                encoders,
-                encoder_kwargs,
-                'application/json+test',
-                ['application/json+test'])
-
-        self.assertIs(response.request, request)
-        self.assertEqual(response.api_data, {
-            'extra1': 'value1',
-            'links': {
-                'my_prev': {
-                    'href': 'http://testserver/?my-start=0&my-max-results=100',
-                    'method': 'GET',
-                },
-            },
-            'my_results': [],
-            'my_total_results': 0,
-            'stat': 'ok',
-        })
-        self.assertEqual(response.status_code, 200)
-        self.assertEqual(response['Header1'], 'value1')
-        self.assertEqual(response.encoders, encoders)
-        self.assertEqual(response.encoder_kwargs, encoder_kwargs)
-        self.assertEqual(response.mimetype, 'application/json+test')
-
     def test_pagination_serialization_encoding(self):
         """Testing WebAPIResponsePaginated query parameter encoding"""
         # This test is for an issue when query parameters included unicode
@@ -323,71 +187,6 @@ class WebAPIResponseErrorTests(TestCase):
         self.assertEqual(response.encoder_kwargs, encoder_kwargs)
         self.assertEqual(response.mimetype, 'application/json+test')
 
-    def test_init_with_deprecated_all_args(self):
-        """Testing WebAPIResponseError.__init__ with deprecated all-args
-        invocation
-        """
-        request = RequestFactory().get('/')
-        headers = {
-            'Header1': 'value1',
-        }
-        encoders = [BasicAPIEncoder()]
-        encoder_kwargs = {
-            'xxx': 123,
-        }
-
-        warning_list: List[ExpectedWarning] = [
-            {
-                'cls': RemovedInDjblets40Warning,
-                'message': (
-                    'Positional argument(s) "extra_params", "headers" must '
-                    'be passed as keyword arguments when calling '
-                    'WebAPIResponseError.__init__(). This will be required '
-                    'in Djblets 4.0.'
-                ),
-            },
-            {
-                'cls': RemovedInDjblets40Warning,
-                'message': (
-                    'Positional argument(s) "api_format", "encoders", '
-                    '"encoder_kwargs", "mimetype", '
-                    '"supported_mimetypes" must be passed as keyword '
-                    'arguments when calling WebAPIResponse.__init__(). This '
-                    'will be required in Djblets 4.0.'
-                ),
-            },
-        ]
-
-        with self.assertWarnings(warning_list):
-            response = WebAPIResponseError(
-                request,
-                INVALID_ATTRIBUTE,
-                {
-                    'extra1': 'value1',
-                },
-                headers,
-                'json',
-                encoders,
-                encoder_kwargs,
-                'application/json+test',
-                ['application/json+test']
-            )
-
-        self.assertIs(response.request, request)
-        self.assertEqual(response.api_data, {
-            'err': {
-                'code': INVALID_ATTRIBUTE.code,
-                'msg': 'Invalid attribute',
-            },
-            'extra1': 'value1',
-            'stat': 'fail',
-        })
-        self.assertEqual(response.status_code, 400)
-        self.assertEqual(response['Header1'], 'value1')
-        self.assertEqual(response.encoders, encoders)
-        self.assertEqual(response.encoder_kwargs, encoder_kwargs)
-        self.assertEqual(response.mimetype, 'application/json+test')
-
 
 class WebAPIResponseFormErrorTests(TestCase):
     """Unit tests for djblets.webapi.responses.WebAPIResponseFormError."""
@@ -435,73 +234,3 @@ class WebAPIResponseFormErrorTests(TestCase):
         self.assertIs(response.encoders, encoders)
         self.assertEqual(response.encoder_kwargs, encoder_kwargs)
         self.assertEqual(response.mimetype, 'application/json+test')
-
-    def test_init_with_deprecated_all_args(self):
-        """Testing WebAPIResponseFormError.__init__ with deprecated all-args
-        invocation
-        """
-        class MyForm(forms.Form):
-            my_field = forms.CharField(required=True)
-
-        request = RequestFactory().get('/')
-        headers = {
-            'Header1': 'value1',
-        }
-        encoders = [BasicAPIEncoder()]
-        encoder_kwargs = {
-            'xxx': 123,
-        }
-
-        form = MyForm({})
-        self.assertFalse(form.is_valid())
-
-        warning_list: List[ExpectedWarning] = [
-            {
-                'cls': RemovedInDjblets40Warning,
-                'message': (
-                    'Positional argument(s) "headers" must be passed as '
-                    'keyword arguments when calling '
-                    'WebAPIResponseError.__init__(). This will be required '
-                    'in Djblets 4.0.'
-                ),
-            },
-            {
-                'cls': RemovedInDjblets40Warning,
-                'message': (
-                    'Positional argument(s) "api_format", "encoders", '
-                    '"encoder_kwargs", "mimetype", '
-                    '"supported_mimetypes" must be passed as keyword '
-                    'arguments when calling WebAPIResponse.__init__(). This '
-                    'will be required in Djblets 4.0.'
-                ),
-            },
-        ]
-
-        with self.assertWarnings(warning_list):
-            response = WebAPIResponseFormError(
-                request,
-                form,
-                headers,
-                'json',
-                encoders,
-                encoder_kwargs,
-                'application/json+test',
-                ['application/json+test']
-            )
-
-        self.assertIs(response.request, request)
-        self.assertEqual(response.api_data, {
-            'err': {
-                'code': INVALID_FORM_DATA.code,
-                'msg': 'One or more fields had errors',
-            },
-            'fields': {
-                'my_field': ['This field is required.'],
-            },
-            'stat': 'fail',
-        })
-        self.assertEqual(response.status_code, 400)
-        self.assertEqual(response['Header1'], 'value1')
-        self.assertEqual(response.encoders, encoders)
-        self.assertEqual(response.encoder_kwargs, encoder_kwargs)
-        self.assertEqual(response.mimetype, 'application/json+test')
