diff --git a/django/newforms/fields.py b/django/newforms/fields.py
index dfe46a2..337a689 100644
--- a/django/newforms/fields.py
+++ b/django/newforms/fields.py
@@ -535,12 +535,14 @@ class BooleanField(Field):
 
     def clean(self, value):
         """Returns a Python boolean object."""
+        if value == 'False':
+            value = False
         super(BooleanField, self).clean(value)
         # Explicitly check for the string 'False', which is what a hidden field
         # will submit for False. Because bool("True") == True, we don't need to
         # handle that explicitly.
-        if value == 'False':
-            return False
+        if not value and self.required:
+            raise ValidationError(self.error_messages['required'])
         return bool(value)
 
 class NullBooleanField(BooleanField):
diff --git a/tests/regressiontests/forms/fields.py b/tests/regressiontests/forms/fields.py
index f3b6a96..207ff80 100644
--- a/tests/regressiontests/forms/fields.py
+++ b/tests/regressiontests/forms/fields.py
@@ -937,18 +937,24 @@ ValidationError: [u'This field is required.']
 >>> f.clean(True)
 True
 >>> f.clean(False)
-False
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
 >>> f.clean(1)
 True
 >>> f.clean(0)
-False
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
 >>> f.clean('Django rocks')
 True
 
 >>> f.clean('True')
 True
 >>> f.clean('False')
-False
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
 
 >>> f = BooleanField(required=False)
 >>> f.clean('')
