Index: django/contrib/contenttypes/models.py
===================================================================
--- django/contrib/contenttypes/models.py	(revision 2292)
+++ django/contrib/contenttypes/models.py	(working copy)
@@ -1,35 +1,25 @@
 from django.db import models
 from django.utils.translation import gettext_lazy as _
 
-class Package(models.Model):
-    label = models.CharField(_('label'), maxlength=20, primary_key=True)
-    name = models.CharField(_('name'), maxlength=30, unique=True)
-    class Meta:
-        verbose_name = _('package')
-        verbose_name_plural = _('packages')
-        db_table = 'django_package'
-        ordering = ('name',)
-
-    def __repr__(self):
-        return self.name
-
 class ContentType(models.Model):
     name = models.CharField(_('name'), maxlength=100)
-    package = models.ForeignKey(Package, db_column='package')
-    python_module_name = models.CharField(_('python module name'), maxlength=50)
+    model = models.CharField(_('python model class name'), maxlength=100, primary_key=True)
+
     class Meta:
         verbose_name = _('content type')
         verbose_name_plural = _('content types')
         db_table = 'django_content_type'
-        ordering = ('package', 'name')
-        unique_together = (('package', 'python_module_name'),)
+        ordering = ('name',)
 
     def __repr__(self):
-        return "%s | %s" % (self.package_id, self.name)
+        return self.name
 
-    def get_model_module(self):
-        "Returns the Python model module for accessing this type of content."
-        return __import__('django.models.%s.%s' % (self.package_id, self.python_module_name), '', '', [''])
+    def get_model_class(self):
+        "Returns the Python model class for accessing this type of content."
+        lastdot = self.model.rfind('.')
+        package = lastdot > 0 and self.model[:lastdot] or ''
+        module = __import__(package, '', '', [''])
+        return getattr(module, self.model[lastdot+1:])
 
     def get_object_for_this_type(self, **kwargs):
         """
@@ -38,4 +28,4 @@
         method. The ObjectNotExist exception, if thrown, will not be caught,
         so code that calls this method should catch it.
         """
-        return self.get_model_module().get_object(**kwargs)
+        return self.get_model_class().objects.get(**kwargs)
Index: django/contrib/auth/models.py
===================================================================
--- django/contrib/auth/models.py	(revision 2292)
+++ django/contrib/auth/models.py	(working copy)
@@ -1,6 +1,6 @@
 from django.core import validators
 from django.db import backend, connection, models
-from django.contrib.contenttypes.models import Package
+from django.contrib.contenttypes.models import ContentType
 from django.utils.translation import gettext_lazy as _
 import datetime
 
@@ -11,16 +11,16 @@
 
 class Permission(models.Model):
     name = models.CharField(_('name'), maxlength=50)
-    package = models.ForeignKey(Package, db_column='package')
+    content_type = models.ForeignKey(ContentType, db_column='content_type')
     codename = models.CharField(_('codename'), maxlength=100)
     class Meta:
         verbose_name = _('Permission')
         verbose_name_plural = _('Permissions')
-        unique_together = (('package', 'codename'),)
-        ordering = ('package', 'codename')
+        unique_together = (('content_type', 'codename'),)
+        ordering = ('content_type', 'codename')
 
     def __repr__(self):
-        return "%s | %s" % (self.package_id, self.name)
+        return "%s | %s" % (self.content_type, self.name)
 
 class Group(models.Model):
     name = models.CharField(_('name'), maxlength=80, unique=True)
@@ -133,7 +133,7 @@
             cursor = connection.cursor()
             # The SQL below works out to the following, after DB quoting:
             # cursor.execute("""
-            #     SELECT p.package, p.codename
+            #     SELECT p.content_type, p.codename
             #     FROM auth_permission p, auth_group_permissions gp, auth_user_groups ug
             #     WHERE p.id = gp.permission_id
             #         AND gp.group_id = ug.group_id
@@ -144,7 +144,7 @@
                 WHERE p.%s = gp.%s
                     AND gp.%s = ug.%s
                     AND ug.%s = %%s""" % (
-                backend.quote_name('package'), backend.quote_name('codename'),
+                backend.quote_name('content_type'), backend.quote_name('codename'),
                 backend.quote_name('auth_permission'), backend.quote_name('auth_group_permissions'),
                 backend.quote_name('auth_user_groups'), backend.quote_name('id'),
                 backend.quote_name('permission_id'), backend.quote_name('group_id'),
@@ -156,7 +156,7 @@
     def get_all_permissions(self):
         if not hasattr(self, '_perm_cache'):
             import sets
-            self._perm_cache = sets.Set(["%s.%s" % (p.package_id, p.codename) for p in self.get_permission_list()])
+            self._perm_cache = sets.Set(["%s.%s" % (p.content_type, p.codename) for p in self.get_permission_list()])
             self._perm_cache.update(self.get_group_permissions())
         return self._perm_cache
 
@@ -175,11 +175,12 @@
                 return False
         return True
 
-    def has_module_perms(self, package_name):
-        "Returns True if the user has any permissions in the given package."
+    # TODO: Rename to has_model_perms?
+    def has_module_perms(self, model_name):
+        "Returns True if the user has any permissions for the given model."
         if self.is_superuser:
             return True
-        return bool(len([p for p in self.get_all_permissions() if p[:p.index('.')] == package_name]))
+        return bool(len([p for p in self.get_all_permissions() if p[:p.index('.')] == model_name]))
 
     def get_and_delete_messages(self):
         messages = []
Index: django/core/management.py
===================================================================
--- django/core/management.py	(revision 2292)
+++ django/core/management.py	(working copy)
@@ -26,12 +26,6 @@
 
 INVALID_PROJECT_NAMES = ('django', 'test')
 
-def _get_packages_insert(app_label):
-    from django.db import backend
-    return "INSERT INTO %s (%s, %s) VALUES ('%s', '%s');" % \
-        (backend.quote_name('django_package'), backend.quote_name('label'), backend.quote_name('name'),
-        app_label, app_label)
-
 def _get_permission_codename(action, opts):
     return '%s_%s' % (action, opts.object_name.lower())
 
@@ -43,17 +37,17 @@
             perms.append((_get_permission_codename(action, opts), 'Can %s %s' % (action, opts.verbose_name)))
     return perms + list(opts.permissions)
 
-def _get_permission_insert(name, codename, opts):
+def _get_permission_insert(name, codename, klass):
     from django.db import backend
     return "INSERT INTO %s (%s, %s, %s) VALUES ('%s', '%s', '%s');" % \
-        (backend.quote_name('auth_permission'), backend.quote_name('name'), backend.quote_name('package'),
-        backend.quote_name('codename'), name.replace("'", "''"), opts.app_label, codename)
+        (backend.quote_name('auth_permission'), backend.quote_name('name'), backend.quote_name('content_type'),
+        backend.quote_name('codename'), name.replace("'", "''"), klass.__module__+'.'+klass.__name__, codename)
 
-def _get_contenttype_insert(opts):
+def _get_contenttype_insert(klass):
     from django.db import backend
-    return "INSERT INTO %s (%s, %s, %s) VALUES ('%s', '%s', '%s');" % \
-        (backend.quote_name('django_content_type'), backend.quote_name('name'), backend.quote_name('package'),
-        backend.quote_name('python_module_name'), opts.verbose_name, opts.app_label, opts.module_name)
+    return "INSERT INTO %s (%s, %s) VALUES ('%s', '%s');" % \
+        (backend.quote_name('django_content_type'), backend.quote_name('name'), backend.quote_name('model'),
+        klass._meta.object_name, klass.__module__+'.'+klass.__name__)
 
 def _is_valid_dir_name(s):
     return bool(re.search(r'^\w+$', s))
@@ -290,7 +284,6 @@
 
     app_models = get_models(app)
     app_label = app_models[0]._meta.app_label
-    output.append(_get_packages_insert(app_label))
     app_dir = os.path.normpath(os.path.join(os.path.dirname(app.__file__), 'sql'))
 
     for klass in app_models:
@@ -307,10 +300,10 @@
                 fp.close()
 
         # Content types.
-        output.append(_get_contenttype_insert(opts))
+        output.append(_get_contenttype_insert(klass))
         # Permissions.
         for codename, name in _get_all_permissions(opts):
-            output.append(_get_permission_insert(name, codename, opts))
+            output.append(_get_permission_insert(name, codename, klass))
     return output
 get_sql_initial_data.help_doc = "Prints the initial INSERT SQL statements for the given app name(s)."
 get_sql_initial_data.args = APP_ARGS
Index: django/db/models/options.py
===================================================================
--- django/db/models/options.py	(revision 2292)
+++ django/db/models/options.py	(working copy)
@@ -88,9 +88,7 @@
         "Returns the content-type ID for this object type."
         if not hasattr(self, '_content_type_id'):
             from django.contrib.contenttypes.models import ContentType
-            self._content_type_id = ContentType.objects.get(
-                python_module_name__exact=self.module_name,
-                package__label__exact=self.app_label).id
+            self._content_type_id = ContentType.objects.get(model__exact=self.module_name+'.'+self.object_name).id
         return self._content_type_id
 
     def get_field(self, name, many_to_many=True):
Index: django/db/models/manipulators.py
===================================================================
--- django/db/models/manipulators.py	(revision 2292)
+++ django/db/models/manipulators.py	(working copy)
@@ -185,8 +185,7 @@
                         # Related links are a special case, because we have to
                         # manually set the "content_type_id" and "object_id" fields.
                         if self.opts.has_related_links and related.opts.module_name == 'relatedlinks':
-                            contenttypes_mod = get_module('core', 'contenttypes')
-                            params['content_type_id'] = contenttypes_mod.get_object(package__label__exact=self.opts.app_label, python_module_name__exact=self.opts.module_name).id
+                            params['content_type_id'] = self.opts.get_content_type_id()
                             params['object_id'] = new_object.id
 
                     # Create the related item.
