diff --git a/django/core/exceptions.py b/django/core/exceptions.py
index 5ccd3e8c63..ee6d5fe37b 100644
--- a/django/core/exceptions.py
+++ b/django/core/exceptions.py
@@ -64,6 +64,11 @@ class ValidationError(Exception):
             return repr(self.message_dict)
         return repr(self.messages)
 
+    def __repr__(self):
+        if hasattr(self, 'message_dict'):
+            return 'ValidationError(%s)' % repr(self.message_dict)
+        return 'ValidationError(%s)' % repr(self.messages)
+
     def update_error_dict(self, error_dict):
         if hasattr(self, 'message_dict'):
             if error_dict:
diff --git a/tests/modeltests/validators/tests.py b/tests/modeltests/validators/tests.py
index 6c1e6d780f..44ad176747 100644
--- a/tests/modeltests/validators/tests.py
+++ b/tests/modeltests/validators/tests.py
@@ -137,7 +137,20 @@ def create_simple_test_method(validator, expected, value, num):
 # Dynamically assemble a test class with the contents of TEST_DATA
 
 class TestSimpleValidators(TestCase):
-    pass
+    def test_single_message(self):
+        v = ValidationError('Not Valid')
+        self.assertEquals(str(v), "[u'Not Valid']")
+        self.assertEquals(repr(v), "ValidationError([u'Not Valid'])")
+
+    def test_message_list(self):
+        v = ValidationError(['First Problem', 'Second Problem'])
+        self.assertEquals(str(v), "[u'First Problem', u'Second Problem']")
+        self.assertEquals(repr(v), "ValidationError([u'First Problem', u'Second Problem'])")
+
+    def test_message_dict(self):
+        v = ValidationError({'first': 'First Problem'})
+        self.assertEquals(str(v), "{'first': 'First Problem'}")
+        self.assertEquals(repr(v), "ValidationError({'first': 'First Problem'})")
 
 test_counter = 0
 for validator, value, expected in TEST_DATA: