Index: django/contrib/contenttypes/models.py
===================================================================
--- django/contrib/contenttypes/models.py	(revision 5234)
+++ django/contrib/contenttypes/models.py	(working copy)
@@ -1,5 +1,6 @@
 from django.db import models
 from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode
 
 CONTENT_TYPE_CACHE = {}
 class ContentTypeManager(models.Manager):
@@ -16,7 +17,7 @@
             # The str() is needed around opts.verbose_name because it's a
             # django.utils.functional.__proxy__ object.
             ct, created = self.model._default_manager.get_or_create(app_label=key[0],
-                model=key[1], defaults={'name': str(opts.verbose_name)})
+                model=key[1], defaults={'name': smart_unicode(opts.verbose_name)})
             CONTENT_TYPE_CACHE[key] = ct
         return ct
 
Index: django/utils/functional.py
===================================================================
--- django/utils/functional.py	(revision 5234)
+++ django/utils/functional.py	(working copy)
@@ -32,6 +32,8 @@
                 self.__dispatch[resultclass] = {}
                 for (k, v) in resultclass.__dict__.items():
                     setattr(self, k, self.__promise__(resultclass, k, v))
+            if unicode in resultclasses:
+                setattr(self, '__unicode__', self.__unicode_cast)
 
         def __promise__(self, klass, funcname, func):
             # Builds a wrapper around some magic method and registers that magic
@@ -47,6 +49,9 @@
             self.__dispatch[klass][funcname] = func
             return __wrapper__
 
+        def __unicode_cast(self):
+            return self.__func(*self.__args, **self.__kw)
+
     def __wrapper__(*args, **kw):
         # Creates the proxy object, instead of the actual value.
         return __proxy__(args, kw)
Index: django/utils/translation/trans_real.py
===================================================================
--- django/utils/translation/trans_real.py	(revision 5234)
+++ django/utils/translation/trans_real.py	(working copy)
@@ -510,7 +510,6 @@
     """"
     lazy variant of string concatenation, needed for translations that are
     constructed from multiple parts. Handles lazy strings and non-strings by
-    first turning all arguments to strings, before joining them.
+    first turning all arguments to unicode, before joining them.
     """
-    return ''.join([str(el) for el in strings])
-
+    return u''.join([smart_unicode(el) for el in strings])
\ No newline at end of file
