diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py
index 0f567bd..9f99c5d 100644
--- a/django/contrib/admin/widgets.py
+++ b/django/contrib/admin/widgets.py
@@ -13,6 +13,7 @@ from django.utils.translation import ugettext as _
 from django.utils.safestring import mark_safe
 from django.utils.encoding import force_unicode
 from django.conf import settings
+from django.core.exceptions import ValidationError
 from django.core.urlresolvers import reverse, NoReverseMatch
 
 class FilteredSelectMultiple(forms.SelectMultiple):
@@ -147,7 +148,7 @@ class ForeignKeyRawIdWidget(forms.TextInput):
         try:
             obj = self.rel.to._default_manager.using(self.db).get(**{key: value})
             return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14))
-        except (ValueError, self.rel.to.DoesNotExist):
+        except (ValidationError, ValueError, self.rel.to.DoesNotExist):
             return ''
 
 class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
diff --git a/django/contrib/comments/views/utils.py b/django/contrib/comments/views/utils.py
index 8b729d2..458da03 100644
--- a/django/contrib/comments/views/utils.py
+++ b/django/contrib/comments/views/utils.py
@@ -8,7 +8,7 @@ from django.http import HttpResponseRedirect
 from django.core import urlresolvers
 from django.shortcuts import render_to_response
 from django.template import RequestContext
-from django.core.exceptions import ObjectDoesNotExist
+from django.core.exceptions import ObjectDoesNotExist, ValidationError
 from django.contrib import comments
 
 def next_redirect(data, default, default_view, **get_kwargs):
@@ -39,7 +39,7 @@ def confirmation_view(template, doc="Display a confirmation view."):
         if 'c' in request.GET:
             try:
                 comment = comments.get_model().objects.get(pk=request.GET['c'])
-            except (ObjectDoesNotExist, ValueError):
+            except (ObjectDoesNotExist, ValidationError):
                 pass
         return render_to_response(template,
             {'comment': comment},
diff --git a/django/contrib/contenttypes/views.py b/django/contrib/contenttypes/views.py
index ac0feff..5163f21 100644
--- a/django/contrib/contenttypes/views.py
+++ b/django/contrib/contenttypes/views.py
@@ -1,7 +1,7 @@
 from django import http
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.sites.models import Site, get_current_site
-from django.core.exceptions import ObjectDoesNotExist
+from django.core.exceptions import ObjectDoesNotExist, ValidationError
 
 def shortcut(request, content_type_id, object_id):
     "Redirect to an object's page based on a content-type ID and an object ID."
@@ -11,7 +11,7 @@ def shortcut(request, content_type_id, object_id):
         if not content_type.model_class():
             raise http.Http404("Content type %s object has no associated model" % content_type_id)
         obj = content_type.get_object_for_this_type(pk=object_id)
-    except (ObjectDoesNotExist, ValueError):
+    except (ObjectDoesNotExist, ValidationError):
         raise http.Http404("Content type %s object %s doesn't exist" % (content_type_id, object_id))
     try:
         absurl = obj.get_absolute_url()
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index fd0a295..3831bb2 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -474,9 +474,7 @@ class AutoField(Field):
         pass
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return int(value)
+        return self.to_python(value)
 
     def contribute_to_class(self, cls, name):
         assert not cls._meta.has_auto_field, "A model can't have more than one AutoField."
@@ -523,9 +521,7 @@ class BooleanField(Field):
         return super(BooleanField, self).get_prep_lookup(lookup_type, value)
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return bool(value)
+        return self.to_python(value)
 
     def formfield(self, **kwargs):
         # Unlike most fields, BooleanField figures out include_blank from
@@ -843,9 +839,7 @@ class FloatField(Field):
     description = _("Floating point number")
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return float(value)
+        return self.to_python(value)
 
     def get_internal_type(self):
         return "FloatField"
@@ -871,9 +865,7 @@ class IntegerField(Field):
     description = _("Integer")
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return int(value)
+        return self.to_python(value)
 
     def get_prep_lookup(self, lookup_type, value):
         if (lookup_type == 'gte' or lookup_type == 'lt') \
@@ -963,9 +955,7 @@ class NullBooleanField(Field):
         return super(NullBooleanField, self).get_prep_lookup(lookup_type, value)
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return bool(value)
+        return self.to_python(value)
 
     def formfield(self, **kwargs):
         defaults = {
@@ -1138,4 +1128,3 @@ class XMLField(TextField):
     def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
         self.schema_path = schema_path
         Field.__init__(self, verbose_name, name, **kwargs)
-
diff --git a/django/forms/models.py b/django/forms/models.py
index 2f41dbf..15faa5b 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -1040,7 +1040,7 @@ class ModelMultipleChoiceField(ModelChoiceField):
         for pk in value:
             try:
                 self.queryset.filter(pk=pk)
-            except ValueError:
+            except ValidationError:
                 raise ValidationError(self.error_messages['invalid_pk_value'] % pk)
         qs = self.queryset.filter(pk__in=value)
         pks = set([force_unicode(o.pk) for o in qs])
diff --git a/tests/modeltests/expressions/tests.py b/tests/modeltests/expressions/tests.py
index 0a136ae..7305ffa 100644
--- a/tests/modeltests/expressions/tests.py
+++ b/tests/modeltests/expressions/tests.py
@@ -1,4 +1,4 @@
-from django.core.exceptions import FieldError
+from django.core.exceptions import FieldError, ValidationError
 from django.db.models import F
 from django.test import TestCase
 
@@ -215,4 +215,4 @@ class ExpressionsTests(TestCase):
             ceo=test_gmbh.ceo
         )
         acme.num_employees = F("num_employees") + 16
-        self.assertRaises(TypeError, acme.save)
+        self.assertRaises(ValidationError, acme.save)
diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py
index 4f9abb6..14945a0 100644
--- a/tests/regressiontests/admin_widgets/tests.py
+++ b/tests/regressiontests/admin_widgets/tests.py
@@ -170,14 +170,17 @@ class AdminForeignKeyRawIdWidget(DjangoTestCase):
             'Select a valid choice. That choice is not one of the available choices.')
 
     def test_invalid_target_id(self):
+        response = self.client.post('%s/admin_widgets/event/add/' % self.admin_root,
+            {"band": -1234})
+        self.assertContains(response,
+            'Select a valid choice. That choice is not one of the available choices.')
 
-        for test_str in ('Iñtërnâtiônàlizætiøn', "1234'", -1234):
+        for test_str in ('Iñtërnâtiônàlizætiøn', "1234'"):
             # This should result in an error message, not a server exception.
             response = self.client.post('%s/admin_widgets/event/add/' % self.admin_root,
                 {"band": test_str})
 
-            self.assertContains(response,
-                'Select a valid choice. That choice is not one of the available choices.')
+            self.assertContains(response, 'This value must be an integer.')
 
 
 class FilteredSelectMultipleWidgetTest(TestCase):
diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py
index a0b4593..5d1c3f1 100644
--- a/tests/regressiontests/model_fields/tests.py
+++ b/tests/regressiontests/model_fields/tests.py
@@ -48,13 +48,38 @@ class BasicFieldTests(test.TestCase):
         except ValidationError, e:
             self.fail("NullBooleanField failed validation with value of None: %s" % e.messages)
 
+class AutoFieldTests(test.TestCase):
+    def test_to_python(self):
+        f = models.AutoField(primary_key=True)
+        self.assertEqual(f.to_python(3), 3)
+        self.assertEqual(f.to_python("3"), 3)
+        self.assertEqual(f.to_python(None), None)
+        self.assertRaises(ValidationError, f.to_python, "abc")
+
+    def test_get_db_prep_value(self):
+        from django.db import connection
+        f = models.AutoField(primary_key=True)
+        self.assertEqual(f.get_db_prep_value(3, connection=connection), 3)
+        self.assertEqual(f.get_db_prep_value("3", connection=connection), 3)
+        self.assertEqual(f.get_db_prep_value(None, connection=connection), None)
+        self.assertRaises(ValidationError, f.get_db_prep_value, "abc", connection=connection)
+
 class DecimalFieldTests(test.TestCase):
     def test_to_python(self):
         f = models.DecimalField(max_digits=4, decimal_places=2)
         self.assertEqual(f.to_python(3), Decimal("3"))
         self.assertEqual(f.to_python("3.14"), Decimal("3.14"))
+        self.assertEqual(f.to_python(None), None)
         self.assertRaises(ValidationError, f.to_python, "abc")
 
+    def test_get_db_prep_value(self):
+        from django.db import connection
+        f = models.DecimalField(max_digits=4, decimal_places=2)
+        self.assertEqual(f.get_db_prep_value(3, connection=connection), 3)
+        self.assertEqual(f.get_db_prep_value("3.14", connection=connection), Decimal("3.14"))
+        self.assertEqual(f.to_python(None), None)
+        self.assertRaises(ValidationError, f.get_db_prep_value, "abc", connection=connection)
+
     def test_default(self):
         f = models.DecimalField(default=Decimal("0.00"))
         self.assertEqual(f.get_default(), Decimal("0.00"))
@@ -128,17 +153,21 @@ class BooleanFieldTests(unittest.TestCase):
         self.assertEqual(f.get_db_prep_lookup('exact', False, connection=connection), [False])
         self.assertEqual(f.get_db_prep_lookup('exact', '0', connection=connection), [False])
         self.assertEqual(f.get_db_prep_lookup('exact', 0, connection=connection), [False])
-        self.assertEqual(f.get_db_prep_lookup('exact', None, connection=connection), [None])
+
 
     def _test_to_python(self, f):
         self.assertTrue(f.to_python(1) is True)
         self.assertTrue(f.to_python(0) is False)
 
     def test_booleanfield_get_db_prep_lookup(self):
+        from django.db import connection
         self._test_get_db_prep_lookup(models.BooleanField())
+        self.assertRaises(ValidationError, models.BooleanField().get_db_prep_lookup, 'exact', None, connection=connection)
 
     def test_nullbooleanfield_get_db_prep_lookup(self):
+        from django.db import connection
         self._test_get_db_prep_lookup(models.NullBooleanField())
+        self.assertEqual(models.NullBooleanField().get_db_prep_lookup('exact', None, connection=connection), [None])
 
     def test_booleanfield_to_python(self):
         self._test_to_python(models.BooleanField())
@@ -270,6 +299,37 @@ class ValidationTest(test.TestCase):
         f = models.BooleanField()
         self.assertRaises(ValidationError, f.clean, None, None)
 
+class IntegerFieldTests(test.TestCase):
+    def test_to_python(self):
+        f = models.IntegerField()
+        self.assertEqual(f.to_python(3), 3)
+        self.assertEqual(f.to_python("3"), 3)
+        self.assertEqual(f.to_python(None), None)
+        self.assertRaises(ValidationError, f.to_python, "abc")
+
+    def test_get_db_prep_value(self):
+        from django.db import connection
+        f = models.IntegerField()
+        self.assertEqual(f.get_db_prep_value(3, connection=connection), 3)
+        self.assertEqual(f.get_db_prep_value("3", connection=connection), 3)
+        self.assertEqual(f.get_db_prep_value(None, connection=connection), None)
+        self.assertRaises(ValidationError, f.get_db_prep_value, "abc", connection=connection)
+
+class FloatFieldTests(test.TestCase):
+    def test_to_python(self):
+        f = models.FloatField()
+        self.assertEqual(f.to_python(3), float("3"))
+        self.assertEqual(f.to_python("3.14"), float("3.14"))
+        self.assertEqual(f.to_python(None), None)
+        self.assertRaises(ValidationError, f.to_python, "abc")
+
+    def test_get_db_prep_value(self):
+        from django.db import connection
+        f = models.FloatField()
+        self.assertEqual(f.get_db_prep_value(3, connection=connection), float(3))
+        self.assertEqual(f.get_db_prep_value("3.14", connection=connection), float("3.14"))
+        self.assertEqual(f.to_python(None), None)
+        self.assertRaises(ValidationError, f.get_db_prep_value, "abc", connection=connection)
 
 class BigIntegerFieldTests(test.TestCase):
     def test_limits(self):
