Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 6224)
+++ django/newforms/fields.py	(working copy)
@@ -492,10 +492,10 @@
         value = smart_unicode(value)
         if value == u'':
             return value
-        valid_values = set([smart_unicode(k) for k, v in self.choices])
+        valid_values = dict([(smart_unicode(k),k) for k, v in self.choices])
         if value not in valid_values:
             raise ValidationError(ugettext(u'Select a valid choice. That choice is not one of the available choices.'))
-        return value
+        return valid_values[value]
 
 class MultipleChoiceField(ChoiceField):
     hidden_widget = MultipleHiddenInput
@@ -511,12 +511,14 @@
             return []
         if not isinstance(value, (list, tuple)):
             raise ValidationError(ugettext(u'Enter a list of values.'))
-        new_value = [smart_unicode(val) for val in value]
         # Validate that each value in the value list is in self.choices.
-        valid_values = set([smart_unicode(k) for k, v in self.choices])
-        for val in new_value:
+        valid_values = dict([(smart_unicode(k),k) for k, v in self.choices])
+        new_value = []
+        for val in [smart_unicode(val) for val in value]:
             if val not in valid_values:
                 raise ValidationError(ugettext(u'Select a valid choice. %s is not one of the available choices.') % val)
+            else:
+                new_value.append(valid_values[val])
         return new_value
 
 class ComboField(Field):
Index: tests/regressiontests/forms/tests.py
===================================================================
--- tests/regressiontests/forms/tests.py	(revision 6231)
+++ tests/regressiontests/forms/tests.py	(working copy)
@@ -1765,9 +1765,9 @@
 ...
 ValidationError: [u'This field is required.']
 >>> f.clean(1)
-u'1'
+'1'
 >>> f.clean('1')
-u'1'
+'1'
 >>> f.clean('3')
 Traceback (most recent call last):
 ...
@@ -1779,9 +1779,9 @@
 >>> f.clean(None)
 u''
 >>> f.clean(1)
-u'1'
+'1'
 >>> f.clean('1')
-u'1'
+'1'
 >>> f.clean('3')
 Traceback (most recent call last):
 ...
@@ -1789,12 +1789,24 @@
 
 >>> f = ChoiceField(choices=[('J', 'John'), ('P', 'Paul')])
 >>> f.clean('J')
-u'J'
+'J'
 >>> f.clean('John')
 Traceback (most recent call last):
 ...
 ValidationError: [u'Select a valid choice. That choice is not one of the available choices.']
 
+>>> f = ChoiceField(choices=[(1, 'John'), (2, 'Paul')])
+>>> f.clean('1')
+1
+>>> f.clean(1)
+1
+
+>>> f = ChoiceField(choices=[(u'1', 'John'), (2, 'Paul')])
+>>> f.clean('1')
+u'1'
+>>> f.clean(1)
+u'1'
+
 # NullBooleanField ############################################################
 
 >>> f = NullBooleanField()
@@ -1821,15 +1833,15 @@
 ...
 ValidationError: [u'This field is required.']
 >>> f.clean([1])
-[u'1']
+['1']
 >>> f.clean(['1'])
-[u'1']
+['1']
 >>> f.clean(['1', '2'])
-[u'1', u'2']
+['1', '2']
 >>> f.clean([1, '2'])
-[u'1', u'2']
+['1', '2']
 >>> f.clean((1, '2'))
-[u'1', u'2']
+['1', '2']
 >>> f.clean('hello')
 Traceback (most recent call last):
 ...
@@ -1853,15 +1865,15 @@
 >>> f.clean(None)
 []
 >>> f.clean([1])
-[u'1']
+['1']
 >>> f.clean(['1'])
-[u'1']
+['1']
 >>> f.clean(['1', '2'])
-[u'1', u'2']
+['1', '2']
 >>> f.clean([1, '2'])
-[u'1', u'2']
+['1', '2']
 >>> f.clean((1, '2'))
-[u'1', u'2']
+['1', '2']
 >>> f.clean('hello')
 Traceback (most recent call last):
 ...
@@ -1875,6 +1887,22 @@
 ...
 ValidationError: [u'Select a valid choice. 3 is not one of the available choices.']
 
+>>> f = MultipleChoiceField(choices=[(1, '1'), (2, '2')])
+>>> f.clean(['1'])
+[1]
+>>> f.clean(['1', '2'])
+[1, 2]
+>>> f.clean([1, '2'])
+[1, 2]
+
+>>> f = MultipleChoiceField(choices=[(u'1', '1'), (u'2', '2')])
+>>> f.clean(['1'])
+[u'1']
+>>> f.clean(['1', '2'])
+[u'1', u'2']
+>>> f.clean([1, '2'])
+[u'1', u'2']
+
 # ComboField ##################################################################
 
 ComboField takes a list of fields that should be used to validate a value,
@@ -2529,12 +2557,12 @@
 >>> f.errors
 {}
 >>> f.cleaned_data
-{'composers': [u'J'], 'name': u'Yesterday'}
+{'composers': ['J'], 'name': u'Yesterday'}
 >>> f = SongForm({'name': 'Yesterday', 'composers': ['J', 'P']}, auto_id=False)
 >>> f.errors
 {}
 >>> f.cleaned_data
-{'composers': [u'J', u'P'], 'name': u'Yesterday'}
+{'composers': ['J', 'P'], 'name': u'Yesterday'}
 
 Validation errors are HTML-escaped when output as HTML.
 >>> class EscapingForm(Form):
Index: tests/regressiontests/forms/regressions.py
===================================================================
--- tests/regressiontests/forms/regressions.py	(revision 6224)
+++ tests/regressiontests/forms/regressions.py	(working copy)
@@ -49,6 +49,13 @@
 >>> UNITS = (('\xd0\xbc\xd0\xb5\xd1\x81.', '\xd0\xbc\xd0\xb5\xd1\x81.'), ('\xd1\x88\xd1\x82.', '\xd1\x88\xd1\x82.'))
 >>> f = ChoiceField(choices=UNITS)
 >>> f.clean(u'\u0448\u0442.')
+'\xd1\x88\xd1\x82.'
+>>> f.clean('\xd1\x88\xd1\x82.')
+'\xd1\x88\xd1\x82.'
+
+>>> UNITS = ((u'\u043c\u0435\u0441.', u'\u043c\u0435\u0441.'), (u'\u0448\u0442.', u'\u0448\u0442.'))
+>>> f = ChoiceField(choices=UNITS)
+>>> f.clean(u'\u0448\u0442.')
 u'\u0448\u0442.'
 >>> f.clean('\xd1\x88\xd1\x82.')
 u'\u0448\u0442.'
