diff --git a/django/contrib/auth/forms.py b/django/contrib/auth/forms.py
index 9279c52..0c542be 100644
--- a/django/contrib/auth/forms.py
+++ b/django/contrib/auth/forms.py
@@ -82,10 +82,11 @@ class UserCreationForm(forms.ModelForm):
     def clean_username(self):
         # Since User.username is unique, this check is redundant,
         # but it sets a nicer error message than the ORM. See #13147.
+        UserModel = self._meta.model
         username = self.cleaned_data["username"]
         try:
-            User.objects.get(username=username)
-        except User.DoesNotExist:
+            UserModel.objects.get(username=username)
+        except UserModel.DoesNotExist:
             return username
         raise forms.ValidationError(self.error_messages['duplicate_username'])
 
diff --git a/django/contrib/auth/tests/forms.py b/django/contrib/auth/tests/forms.py
index f3eb242..b63624c 100644
--- a/django/contrib/auth/tests/forms.py
+++ b/django/contrib/auth/tests/forms.py
@@ -5,6 +5,7 @@ from django.contrib.auth.models import User
 from django.contrib.auth.forms import (UserCreationForm, AuthenticationForm,
     PasswordChangeForm, SetPasswordForm, UserChangeForm, PasswordResetForm)
 from django.contrib.auth.tests.utils import skipIfCustomUser
+from django.contrib.auth.tests.custom_user import ExtensionUser
 from django.core import mail
 from django.forms.fields import Field, EmailField
 from django.test import TestCase
@@ -362,3 +363,18 @@ class PasswordResetFormTest(TestCase):
         self.assertFalse(form.is_valid())
         self.assertEqual(form["email"].errors,
                          [_("The user account associated with this email address cannot reset the password.")])
+
+
+@override_settings(AUTH_USER_MODEL='auth.ExtensionUser')
+class CustomUserCreationFormTest(TestCase):
+    def test_form_validates(self):
+        class CustomUserCreationForm(UserCreationForm):
+            class Meta(UserCreationForm.Meta):
+                model = ExtensionUser
+        data = {
+            'username': 'jsmith',
+            'password1': 'test123',
+            'password2': 'test123',
+            }
+        form = CustomUserCreationForm(data)
+        self.assertTrue(form.is_valid())
diff --git a/docs/topics/auth.txt b/docs/topics/auth.txt
index e313b23..297214c 100644
--- a/docs/topics/auth.txt
+++ b/docs/topics/auth.txt
@@ -2061,24 +2061,20 @@ As you may expect, built-in Django's :ref:`forms <built-in-auth-forms>`
 and :ref:`views <other-built-in-views>` make certain assumptions about
 the user model that they are working with.
 
-If your user model doesn't follow the same assumptions, it may be necessary to define
-a replacement form, and pass that form in as part of the configuration of the
-auth views.
+The following forms are compatible with any subclass of
+:class:`~django.contrib.auth.models.AbstractBaseUser`:
 
-* :class:`~django.contrib.auth.forms.UserCreationForm`
+* :class:`~django.contrib.auth.forms.AuthenticationForm`
 
-  Depends on the :class:`~django.contrib.auth.models.User` model.
-  Must be re-written for any custom user model.
+  Uses the field defined in `USERNAME_FIELD`.
 
-* :class:`~django.contrib.auth.forms.UserChangeForm`
+* :class:`~django.contrib.auth.forms.SetPasswordForm`
 
-  Depends on the :class:`~django.contrib.auth.models.User` model.
-  Must be re-written for any custom user model.
+* :class:`~django.contrib.auth.forms.PasswordChangeForm`
 
-* :class:`~django.contrib.auth.forms.AuthenticationForm`
+* :class:`~django.contrib.auth.forms.AdminPasswordChangeForm`
 
-  Works with any subclass of :class:`~django.contrib.auth.models.AbstractBaseUser`,
-  and will adapt to use the field defined in `USERNAME_FIELD`.
+The following forms make assumptions about the user model and can be used as-is if they are met:
 
 * :class:`~django.contrib.auth.forms.PasswordResetForm`
 
@@ -2086,17 +2082,23 @@ auth views.
   `email` that can be used to identify the user, and a boolean field
   named `is_active` to prevent password resets for inactive users.
 
-* :class:`~django.contrib.auth.forms.SetPasswordForm`
+Finally, the following forms are tied directly to auth.User and need to be re-written or extended to work with a custom user model:
 
-  Works with any subclass of :class:`~django.contrib.auth.models.AbstractBaseUser`
+* :class:`~django.contrib.auth.forms.UserCreationForm`
 
-* :class:`~django.contrib.auth.forms.PasswordChangeForm`
+* :class:`~django.contrib.auth.forms.UserChangeForm`
 
-  Works with any subclass of :class:`~django.contrib.auth.models.AbstractBaseUser`
 
-* :class:`~django.contrib.auth.forms.AdminPasswordChangeForm`
+If your custom user model is a simple subclass of
+:class:`~django.contrib.auth.models.AbstractUser`, then you can extend the forms
+in this manner::
+
+    from django.contrib.auth.forms import UserCreationForm
+    from myapp.models import CustomUser
 
-  Works with any subclass of :class:`~django.contrib.auth.models.AbstractBaseUser`
+    class CustomUserCreationForm(UserCreationForm):
+        class Meta(UserCreationForm.Meta):
+            model = CustomUser
 
 
 Custom users and django.contrib.admin
