diff --git a/djblets/avatars/registry.py b/djblets/avatars/registry.py
index 09f3fb76a2b5c7d09cddb43a20dfd015ede729a7..5320e6398fb680ec9d8e65dbe2e686ecc647dd0a 100644
--- a/djblets/avatars/registry.py
+++ b/djblets/avatars/registry.py
@@ -12,6 +12,7 @@ from djblets.avatars.errors import (AvatarServiceNotFoundError,
 from djblets.avatars.services.gravatar import GravatarService
 from djblets.avatars.services.url import URLAvatarService
 from djblets.avatars.settings import AvatarSettingsManager
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.privacy.consent import Consent, get_consent_tracker
 from djblets.registries.registry import (ALREADY_REGISTERED,
                                          ATTRIBUTE_REGISTERED, DEFAULT_ERRORS,
@@ -231,7 +232,7 @@ class AvatarServiceRegistry(Registry):
         warnings.warn('Setting AvatarServiceRegistry.enabled_services is '
                       'deprecated in favor of calling '
                       'AvatarServiceRegistry.set_enabled_services.',
-                      DeprecationWarning)
+                      RemovedInDjblets20Warning)
 
         self.set_enabled_services(services, save=True)
 
diff --git a/djblets/configforms/forms.py b/djblets/configforms/forms.py
index 15cf80cd3306a178538d2b55f80a09ffa0be146b..4be0e6248e7995e8efb7955d79eebfce46a885df 100644
--- a/djblets/configforms/forms.py
+++ b/djblets/configforms/forms.py
@@ -9,6 +9,7 @@ from django.template.context import RequestContext
 from django.utils import six
 from django.utils.translation import ugettext_lazy as _
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.util.compat.django.template.loader import render_to_string
 
 
@@ -93,7 +94,7 @@ class ConfigPageForm(forms.Form):
         """
         warnings.warn('ConfigFormPage.profile is deprecated. Update your code '
                       'to fetch the profile manually instead.',
-                      DeprecationWarning)
+                      RemovedInDjblets20Warning)
 
         return self.user.get_profile()
 
diff --git a/djblets/configforms/tests/test_config_page_form.py b/djblets/configforms/tests/test_config_page_form.py
index 29b942e572bc50bf81c23c605421a372d9c6acbc..e4d148d5321eb19c08daf4152db23f36ee81bacb 100644
--- a/djblets/configforms/tests/test_config_page_form.py
+++ b/djblets/configforms/tests/test_config_page_form.py
@@ -12,6 +12,7 @@ from django.utils import six
 from djblets.configforms.forms import ConfigPageForm
 from djblets.configforms.pages import ConfigPage
 from djblets.configforms.views import ConfigPagesView
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.testing.testcases import TestCase
 
 
@@ -60,7 +61,7 @@ class ConfigPageFormTests(TestCase):
         # Django 1.6, the other about our own deprecation. Ours will be first.
         message = w[0].message
 
-        self.assertIsInstance(message, DeprecationWarning)
+        self.assertIsInstance(message, RemovedInDjblets20Warning)
         self.assertEqual(
             six.text_type(message),
             'ConfigFormPage.profile is deprecated. Update your code to '
diff --git a/djblets/datagrid/templatetags/datagrid.py b/djblets/datagrid/templatetags/datagrid.py
index 4ad9538f77b94c027967ef131572b77419215560..47fdbc587abf97b09a8c91896c4248b5d15adbbe 100644
--- a/djblets/datagrid/templatetags/datagrid.py
+++ b/djblets/datagrid/templatetags/datagrid.py
@@ -30,6 +30,8 @@ import warnings
 
 from django import template
 
+from djblets.deprecation import RemovedInDjblets20Warning
+
 
 register = template.Library()
 
@@ -41,7 +43,8 @@ def paginator(context, adjacent_pages=3):
     """Renders a paginator used for jumping between pages of results."""
 
     warnings.warn('djblets.datagrid.templatetags datagrid is deprecated,'
-                  ' Use DataGrid.render_paginator', DeprecationWarning)
+                  ' Use DataGrid.render_paginator',
+                  RemovedInDjblets20Warning)
 
     page_nums = range(max(1, context['page'] - adjacent_pages),
                       min(context['pages'], context['page'] + adjacent_pages)
diff --git a/djblets/db/fields/json_field.py b/djblets/db/fields/json_field.py
index 55e5c945ce4b9c8e440ab6afdc8bd147800d5658..4e801ee15f2b23d683f0439f89bb53acba150a49 100644
--- a/djblets/db/fields/json_field.py
+++ b/djblets/db/fields/json_field.py
@@ -13,6 +13,7 @@ from django.db.models.signals import post_init
 from django.utils import six
 
 from djblets.db.validators import validate_json
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.util.decorators import cached_property
 from djblets.util.serializers import DjbletsJSONEncoder
 
@@ -192,7 +193,7 @@ class JSONField(models.TextField):
             warnings.warn('The encoder argument to JSONField has been '
                           'replaced by the encoder_cls and encoder_kwargs '
                           'arguments. Support for encoder is deprecated.',
-                          DeprecationWarning)
+                          RemovedInDjblets20Warning)
 
             # Override the encoder property to hard-code the provided instance.
             self.encoder = encoder
diff --git a/djblets/db/tests/test_json_field.py b/djblets/db/tests/test_json_field.py
index f08c3a00422b5d21c14c3e28ba1b15919b26f68a..bea6b16cab268b318ccdc1d1cb86b1a7a31fdf85 100644
--- a/djblets/db/tests/test_json_field.py
+++ b/djblets/db/tests/test_json_field.py
@@ -8,6 +8,7 @@ from django.db.models import Model
 from django.utils import six
 
 from djblets.db.fields import JSONField, JSONFormField
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.testing.testcases import TestCase
 
 
@@ -53,7 +54,7 @@ class JSONFieldTests(TestCase):
         self.assertEqual(len(w), 1)
 
         message = w[0].message
-        self.assertIsInstance(message, DeprecationWarning)
+        self.assertIsInstance(message, RemovedInDjblets20Warning)
         self.assertEqual(six.text_type(message),
                          'The encoder argument to JSONField has been '
                          'replaced by the encoder_cls and encoder_kwargs '
diff --git a/djblets/deprecation.py b/djblets/deprecation.py
new file mode 100644
index 0000000000000000000000000000000000000000..300868e345b0665692f35e08b9ef2cb4c2a712b4
--- /dev/null
+++ b/djblets/deprecation.py
@@ -0,0 +1,81 @@
+"""Internal support for handling deprecations in Djblets.
+
+The version-specific objects in this module are not considered stable between
+releases, and may be removed at any point. The base objects are considered
+stable.
+"""
+
+from __future__ import unicode_literals
+
+import warnings
+
+from django.utils.functional import SimpleLazyObject
+
+
+class BaseRemovedInDjbletsVersionWarning(DeprecationWarning):
+    """Base class for a Djblets deprecation warning.
+
+    All version-specific deprecation warnings inherit from this, allowing
+    callers to check for Djblets deprecations without being tied to a specific
+    version.
+    """
+
+
+class RemovedInDjblets20Warning(BaseRemovedInDjbletsVersionWarning):
+    """Deprecations for features removed in Djblets 2.0.
+
+    Note that this class will itself be removed in Djblets 2.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`.
+    """
+
+
+#: An alias for the next release of Djblets where features would be removed.
+RemovedInNextDjbletsVersionWarning = RemovedInDjblets20Warning
+
+
+def deprecated_arg_value(owner_name, value, old_arg_name, new_arg_name=None,
+                         warning_cls=DeprecationWarning):
+    """Wrap a value in a lazy object to warn when used.
+
+    Args:
+        owner_name (unicode):
+            The name of the owner of this argument.
+
+        value (object):
+            The argument value.
+
+        old_arg_name (unicode):
+            The name of the argument that was deprecated.
+
+        new_arg_name (unicode, optional):
+            The optional name of the argument to use in the deprecated
+            argument's place, if one is available.
+
+        warning_cls (type, optional):
+            The class to use for the warning. This should be
+            :py:exc:`DeprecationWarning`, :py:exc:`PendingDeprecationWarning`,
+            or a subclass of one.
+
+    Returns:
+        django.utils.functional.SimpleLazyObject:
+        The value wrapped in a lazy object. The first time it is accessed,
+        a warning will be emitted.
+    """
+    def _warn_on_use():
+        if new_arg_name:
+            warnings.warn('The "%s" argument for "%s" has been deprecated '
+                          'and will be removed in a future version. Use "%s" '
+                          'instead.'
+                          % (old_arg_name, owner_name, new_arg_name),
+                          warning_cls)
+        else:
+            warnings.warn('The "%s" argument for "%s" has been deprecated '
+                          'and will be removed in a future version.'
+                          % (old_arg_name, owner_name),
+                          warning_cls)
+
+        return value
+
+    return SimpleLazyObject(_warn_on_use)
diff --git a/djblets/extensions/extension.py b/djblets/extensions/extension.py
index a26ced70a198a02b32f91aaf48038d3e0b60015b..e3c4144317de1a9e44e22cfbb042c0cd26096678 100644
--- a/djblets/extensions/extension.py
+++ b/djblets/extensions/extension.py
@@ -16,6 +16,7 @@ from django.core.urlresolvers import get_mod_func
 from django.utils.encoding import python_2_unicode_compatible
 from django.utils.translation import ugettext as _
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.extensions.settings import Settings
 from djblets.util.decorators import cached_property
 
@@ -506,7 +507,7 @@ class ExtensionInfo(object):
                     'ExtensionInfo.__init__() no longer accepts an '
                     'EntryPoint. Please update your code to call '
                     'ExtensionInfo.create_from_entrypoint() instead.',
-                    DeprecationWarning)
+                    RemovedInDjblets20Warning)
             else:
                 logger.error('Unexpected parameters passed to '
                              'ExtensionInfo.__init__: ext_class=%r, '
diff --git a/djblets/extensions/forms.py b/djblets/extensions/forms.py
index d87f194378ca1607efb07c813244beeb53ed7b43..d3df2db44d5ba5c64cf75d39f99359f3c81f800e 100644
--- a/djblets/extensions/forms.py
+++ b/djblets/extensions/forms.py
@@ -27,6 +27,7 @@ from __future__ import unicode_literals
 
 import warnings
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.forms.forms import KeyValueForm
 from djblets.util.decorators import cached_property
 
@@ -53,7 +54,7 @@ class SettingsForm(KeyValueForm):
         warnings.warn(
             'SettingsForm.siteconfig is deprecated. Update your code to '
             'use SettingsForm.settings instead.',
-            DeprecationWarning)
+            RemovedInDjblets20Warning)
 
         return self.instance
 
diff --git a/djblets/extensions/hooks.py b/djblets/extensions/hooks.py
index 4c1db882618409ef8c6450e12d7656945dab702a..395de6b0c7c92f543592d7be8babb74339ecbfca 100644
--- a/djblets/extensions/hooks.py
+++ b/djblets/extensions/hooks.py
@@ -24,6 +24,7 @@ import warnings
 from django.template import RequestContext
 from django.utils import six
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.util.compat.django.template.loader import render_to_string
 
 
@@ -205,7 +206,7 @@ class ExtensionHook(object):
                 % {
                     'name': self.__class__.__name__,
                 },
-                DeprecationWarning)
+                RemovedInDjblets20Warning)
 
             # Don't call shutdown() again, as the subclass might have already
             # dealt with state cleanup.
diff --git a/djblets/extensions/loaders.py b/djblets/extensions/loaders.py
index 204a5efb77d131173077cd75360b114654f72394..a0a2a697c2ff3ce1595809bda22de8e7dc79ae19 100644
--- a/djblets/extensions/loaders.py
+++ b/djblets/extensions/loaders.py
@@ -12,6 +12,7 @@ except ImportError:
     # Django < 1.8
     from django.template.loader import BaseLoader
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.extensions.manager import get_extension_managers
 
 
@@ -62,7 +63,7 @@ def load_template_source(template_name, template_dirs=None):
     warnings.warn(
         "'djblets.extensions.loaders.load_template_source' is deprecated; "
         "use 'djblets.extensions.loaders.Loader' instead.",
-        DeprecationWarning)
+        RemovedInDjblets20Warning)
 
     if _loader is None:
         _loader = Loader()
diff --git a/djblets/gravatars/__init__.py b/djblets/gravatars/__init__.py
index ea40341ac7ba32f3e7c119fec828038ad12eb1ac..2cfd746d111c6f8647529d0c852979cb91c5d137 100644
--- a/djblets/gravatars/__init__.py
+++ b/djblets/gravatars/__init__.py
@@ -32,6 +32,8 @@ from django.conf import settings
 from django.http import QueryDict
 from django.utils import six
 
+from djblets.deprecation import RemovedInDjblets20Warning
+
 
 default_app_config = 'djblets.gravatars.apps.GravatarsAppConfig'
 
@@ -64,7 +66,7 @@ def get_gravatar_url_for_email(request=None, email=None, size=None):
              "argument is deprecated and should be None. It will be removed "
              "in Djblets 2.0. Use get_gravatar_url_for_email(email=email, "
              "size=size) instead.",
-             DeprecationWarning)
+             RemovedInDjblets20Warning)
 
     if email:
         email = email.strip().lower()
@@ -128,7 +130,7 @@ def get_gravatar_url(request=None, user=None, size=None):
         warn("djblets.gravatars.get_gravatar_url's request request argument "
              "is deprecated and should be None. It will be removed in Djblets "
              "2.0. Use get_gravatar_url(user=user, size=size) instead.",
-             DeprecationWarning)
+             RemovedInDjblets20Warning)
 
     if user is None:
         raise ValueError('"user" cannot be None.')
diff --git a/djblets/urls/patterns.py b/djblets/urls/patterns.py
index 7cc4661422ccc93a913e8f324fd2ac0357263409..02689273c68611f76125f05e34b34491df650a19 100644
--- a/djblets/urls/patterns.py
+++ b/djblets/urls/patterns.py
@@ -7,6 +7,8 @@ from django.core.urlresolvers import RegexURLPattern
 from django.utils import six
 from django.views.decorators.cache import never_cache
 
+from djblets.deprecation import RemovedInDjblets20Warning
+
 
 def never_cache_patterns(*args):
     """Prevent any included URLs from being cached by the browser.
@@ -38,7 +40,7 @@ def never_cache_patterns(*args):
                'deprecated, and will not work on Django 1.10 or higher.')
 
         if hasattr(RegexURLPattern, 'add_prefix'):
-            warnings.warn(msg, DeprecationWarning)
+            warnings.warn(msg, RemovedInDjblets20Warning)
         else:
             raise ValueError(msg)
 
diff --git a/djblets/util/cache.py b/djblets/util/cache.py
index 722319d4c814bfe034113183c37677a7f907e5dd..73cdae6540e973787d46e1f785d4a2d2d15d8f8b 100644
--- a/djblets/util/cache.py
+++ b/djblets/util/cache.py
@@ -2,10 +2,12 @@ from __future__ import unicode_literals
 import warnings
 
 from djblets.cache.backend_compat import normalize_cache_backend
+from djblets.deprecation import RemovedInDjblets20Warning
 
 
 warnings.warn('djblets.util.cache is deprecated. Use '
-              'djblets.cache.backend_compat.', DeprecationWarning)
+              'djblets.cache.backend_compat.',
+              RemovedInDjblets20Warning)
 
 
 __all__ = ['normalize_cache_backend']
diff --git a/djblets/util/context_processors.py b/djblets/util/context_processors.py
index a2937e6269c6e2343027432d2e2810474dcca062..b98a07068f39deb53e37c9b463593caa6fd10842 100644
--- a/djblets/util/context_processors.py
+++ b/djblets/util/context_processors.py
@@ -27,14 +27,15 @@
 from __future__ import unicode_literals
 import warnings
 
-from djblets.siteconfig.context_processors import settings_vars as settingsVars
-from djblets.urls.context_processors import site_root as siteRoot
 from djblets.cache.context_processors import (ajax_serial as ajaxSerial,
                                               media_serial as mediaSerial)
+from djblets.deprecation import RemovedInDjblets20Warning
+from djblets.siteconfig.context_processors import settings_vars as settingsVars
+from djblets.urls.context_processors import site_root as siteRoot
 
 
 warnings.warn('djblets.util.context_processors is deprecated',
-              DeprecationWarning)
+              RemovedInDjblets20Warning)
 
 
 __all__ = [
diff --git a/djblets/util/db.py b/djblets/util/db.py
index 78050cf0fe5b85c31155199de1059ae258023833..a8782b49f4540b4819cbf3ae28bcfed4ccbb71c2 100644
--- a/djblets/util/db.py
+++ b/djblets/util/db.py
@@ -2,9 +2,10 @@ from __future__ import unicode_literals
 import warnings
 
 from djblets.db.managers import ConcurrencyManager
+from djblets.deprecation import RemovedInDjblets20Warning
 
 
-warnings.warn('djblets.util.db is deprecated', DeprecationWarning)
+warnings.warn('djblets.util.db is deprecated', RemovedInDjblets20Warning)
 
 
 __all__ = ['ConcurrencyManager']
diff --git a/djblets/util/dbevolution.py b/djblets/util/dbevolution.py
index 64e91db2c2167aac39de67f7537948310a18f321..429cab267ed9d90432e8d14047a751ce0c230057 100644
--- a/djblets/util/dbevolution.py
+++ b/djblets/util/dbevolution.py
@@ -2,10 +2,12 @@ from __future__ import unicode_literals
 import warnings
 
 from djblets.db.evolution import FakeChangeFieldType
+from djblets.deprecation import RemovedInDjblets20Warning
 
 
 warnings.warn('djblets.util.dbevolution is deprecated. Use '
-              'djblets.db.evolution instead.', DeprecationWarning)
+              'djblets.db.evolution instead.',
+              RemovedInDjblets20Warning)
 
 
 __all__ = ['FakeChangeFieldType']
diff --git a/djblets/util/decorators.py b/djblets/util/decorators.py
index 8f1855078fb88be14052929f75ccbb9abf5b6d7a..1cdb7fabc8a6fbd942244101a95d7bbaff0dcf89 100644
--- a/djblets/util/decorators.py
+++ b/djblets/util/decorators.py
@@ -35,6 +35,8 @@ from django.conf import settings
 from django.template import TemplateSyntaxError, Variable
 from django.utils.functional import cached_property as django_cached_property
 
+from djblets.deprecation import RemovedInDjblets20Warning
+
 
 # The decorator decorator.  This is copyright unknown, verbatim from
 # http://wiki.python.org/moin/PythonDecoratorLibrary
@@ -300,7 +302,7 @@ def root_url(url_func):
             return url
 
     warnings.warn('djblets.util.decorators.root_url is deprecated.',
-                  DeprecationWarning)
+                  RemovedInDjblets20Warning)
 
     return _add_root
 
diff --git a/djblets/util/forms.py b/djblets/util/forms.py
index 8f5b2fb7ff25c5bdf7f3ad98c1c13f680337e766..76688dfc1e1a49a8550d0951812ac05dcb1168ce 100644
--- a/djblets/util/forms.py
+++ b/djblets/util/forms.py
@@ -1,11 +1,13 @@
 from __future__ import unicode_literals
 import warnings
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.forms.fields import TIMEZONE_CHOICES, TimeZoneField
 
 
 warnings.warn('djblets.util.forms is deprecated. Use '
-              'djblets.forms.fields instead.', DeprecationWarning)
+              'djblets.forms.fields instead.',
+              RemovedInDjblets20Warning)
 
 
 __all__ = [
diff --git a/djblets/util/misc.py b/djblets/util/misc.py
index e0583ffc3ac76fab4fc7b8a350477c70a6e228d2..df4784145efce6949e0a341cfd19762527d4fd4a 100644
--- a/djblets/util/misc.py
+++ b/djblets/util/misc.py
@@ -33,10 +33,11 @@ from djblets.cache.serials import (generate_ajax_serial,
                                    generate_locale_serial,
                                    generate_media_serial)
 from djblets.db.query import get_object_or_none
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.urls.patterns import never_cache_patterns
 
 
-warnings.warn('djblets.util.misc is deprecated', DeprecationWarning)
+warnings.warn('djblets.util.misc is deprecated', RemovedInDjblets20Warning)
 
 
 __all__ = [
diff --git a/djblets/util/rooturl.py b/djblets/util/rooturl.py
index f07b47c154dcd333c404a92a8c793e8570676b1d..a038e97edc1f3fda7a167cada6121d49ddc56c85 100644
--- a/djblets/util/rooturl.py
+++ b/djblets/util/rooturl.py
@@ -1,11 +1,13 @@
 from __future__ import unicode_literals
 import warnings
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.urls.root import urlpatterns
 
 
 warnings.warn('djblets.util.rooturl is deprecated. Use '
-              'djblets.urls.root instead.', DeprecationWarning)
+              'djblets.urls.root instead.',
+              RemovedInDjblets20Warning)
 
 
 __all__ = ['urlpatterns']
diff --git a/djblets/util/testing.py b/djblets/util/testing.py
index 15156f0a3ee34d2b11bd96fe3be1b5c62503509b..86e41f7e2b2cbb310347fee0a313cc4147ce7642 100644
--- a/djblets/util/testing.py
+++ b/djblets/util/testing.py
@@ -27,12 +27,13 @@
 from __future__ import unicode_literals
 import warnings
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.testing.testcases import (StubNodeList, StubParser,
                                        TagTest, TestCase)
 
 
 warnings.warn('djblets.util.testing is deprecated. Use '
-              'djblets.testing.testcases instead.', DeprecationWarning)
+              'djblets.testing.testcases instead.', RemovedInDjblets20Warning)
 
 
 __all__ = ['StubNodeList', 'StubParser', 'TagTest', 'TestCase']
diff --git a/djblets/util/urlresolvers.py b/djblets/util/urlresolvers.py
index 5c5b442276e4f83f17768031bb7cd587580d019c..4a07512860ffaa101cc3a75fe6c504fadd8fca6e 100644
--- a/djblets/util/urlresolvers.py
+++ b/djblets/util/urlresolvers.py
@@ -1,11 +1,13 @@
 from __future__ import unicode_literals
 import warnings
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.urls.resolvers import DynamicURLResolver
 
 
 warnings.warn('djblets.util.urlresolvers is deprecated. See '
-              'djblets.urls.resolvers.', DeprecationWarning)
+              'djblets.urls.resolvers.',
+              RemovedInDjblets20Warning)
 
 
 __all__ = ['DynamicURLResolver']
diff --git a/djblets/webapi/core.py b/djblets/webapi/core.py
index ce540e2c1416639f83260d8b78150a87f91e63ef..4311b28600c95b83476daca1acaad4591e59dac8 100644
--- a/djblets/webapi/core.py
+++ b/djblets/webapi/core.py
@@ -28,6 +28,7 @@ from __future__ import unicode_literals
 
 import warnings
 
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.webapi.decorators import SPECIAL_PARAMS
 from djblets.webapi.encoders import (BasicAPIEncoder, JSONEncoderAdapter,
                                      WebAPIEncoder, XMLEncoderAdapter,
@@ -37,7 +38,7 @@ from djblets.webapi.responses import (WebAPIResponse, WebAPIResponseError,
                                       WebAPIResponsePaginated)
 
 
-warnings.warn('djblets.webapi.core is deprecated', DeprecationWarning)
+warnings.warn('djblets.webapi.core is deprecated', RemovedInDjblets20Warning)
 
 
 __all__ = [
diff --git a/djblets/webapi/resources/base.py b/djblets/webapi/resources/base.py
index c0c368a2791c8a510d2b59558baa4ec9ca0ef573..bf399b1ec660b9702ef69ebde28d1c606abbea55 100644
--- a/djblets/webapi/resources/base.py
+++ b/djblets/webapi/resources/base.py
@@ -18,6 +18,7 @@ from django.views.decorators.vary import vary_on_headers
 from djblets.auth.ratelimit import (RATE_LIMIT_API_ANONYMOUS,
                                     RATE_LIMIT_API_AUTHENTICATED,
                                     get_usage_count)
+from djblets.deprecation import RemovedInDjblets20Warning
 from djblets.util.http import (get_modified_since, encode_etag,
                                etag_if_none_match,
                                set_last_modified, set_etag,
@@ -1198,10 +1199,10 @@ class WebAPIResource(object):
         # Future versions of Djblets will remove the encode_etag argument.
         if encode_etag:
             warnings.warn('WebAPIResource.generate_etag will stop generating '
-                          'encoded ETags in 0.9.x. Update your get_etag() '
+                          'encoded ETags in 2.0.x. Update your get_etag() '
                           'method to pass encode_etag=False to this function '
                           'and to call encode_etag() on the result instead.',
-                          DeprecationWarning)
+                          RemovedInDjblets20Warning)
             etag = self.encode_etag(request, etag)
 
         return etag
