diff --git a/django/newforms/fields.py b/django/newforms/fields.py
index d83cb6cde2..2e0cfb3f92 100644
--- a/django/newforms/fields.py
+++ b/django/newforms/fields.py
@@ -144,7 +144,7 @@ class IntegerField(Field):
         if value in EMPTY_VALUES:
             return None
         try:
-            value = int(value)
+            value = int(str(value))
         except (ValueError, TypeError):
             raise ValidationError(ugettext(u'Enter a whole number.'))
         if self.max_value is not None and value > self.max_value:
@@ -192,7 +192,7 @@ class DecimalField(Field):
         super(DecimalField, self).clean(value)
         if not self.required and value in EMPTY_VALUES:
             return None
-        value = value.strip()
+        value = str(value).strip()
         try:
             value = Decimal(value)
         except DecimalException:
diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py
index b85897897f..72033a4e60 100644
--- a/tests/regressiontests/forms/tests.py
+++ b/tests/regressiontests/forms/tests.py
@@ -961,6 +961,12 @@ True
 Traceback (most recent call last):
 ...
 ValidationError: [u'Enter a whole number.']
+>>> f.clean(42)
+42
+>>> f.clean(3.14)
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a whole number.']
 >>> f.clean('1 ')
 1
 >>> f.clean(' 1')
@@ -1084,6 +1090,10 @@ True
 23.0
 >>> f.clean('3.14')
 3.1400000000000001
+>>> f.clean(3.14)
+3.1400000000000001
+>>> f.clean(42)
+42.0
 >>> f.clean('a')
 Traceback (most recent call last):
 ...
@@ -1142,6 +1152,10 @@ True
 Decimal("23")
 >>> f.clean('3.14')
 Decimal("3.14")
+>>> f.clean(3.14)
+Decimal("3.14")
+>>> f.clean(Decimal('3.14'))
+Decimal("3.14")
 >>> f.clean('a')
 Traceback (most recent call last):
 ...