Index: contrib/contenttypes/management.py
===================================================================
--- contrib/contenttypes/management.py	(revision 12213)
+++ contrib/contenttypes/management.py	(working copy)
@@ -26,16 +26,39 @@
             if verbosity >= 2:
                 print "Adding content type '%s | %s'" % (ct.app_label, ct.model)
     # The presence of any remaining content types means the supplied app has an
-    # undefined model and can safely be removed, which cascades to also remove
-    # related permissions.
-    for ct in content_types:
-        if verbosity >= 2:
-            print "Deleting stale content type '%s | %s'" % (ct.app_label, ct.model)
-        ct.delete()
+    # undefined model. It may not be safe to remove it, however, if other
+    # models reference it by foreign key.
+    if content_types:
+        if kwargs.get('interactive', False):
+            content_type_display = ', '.join(['%s | %s' % (ct.app_label, ct.model) for ct in content_types])
+            ok_to_delete = raw_input("""The following content types are stale:
+%s
+Would you like to delete them? If another object references one of these by a foreign key, it will also get deleted, which may not be what you want. 
+If you're unsure, answer 'no'.
 
-def update_all_contenttypes(verbosity=2):
+    Type 'yes' to continue, or 'no' to cancel: """ % content_type_display)
+        else:
+            ok_to_delete = False
+
+        if ok_to_delete == 'yes':
+            for ct in content_types:
+                if verbosity >= 2:
+                    print "Deleting stale content type '%s | %s'" % (ct.app_label, ct.model)
+                ct.delete()
+        else:
+            if verbosity >= 2:
+                print """
+Stale content types remain. To clean them up, call ct.delete on each of the
+following objects after verifying that they are not referenced anywhere:
+
+>>> from django.contrib.contenttypes.models import ContentType"""
+                for ct in content_types:
+                    print ">>> ct = ContentType.objects.get(app_label=%r, model=%r)" % (ct.app_label, ct.model)
+
+
+def update_all_contenttypes(verbosity=2, **kwargs):
     for app in get_apps():
-        update_contenttypes(app, None, verbosity)
+        update_contenttypes(app, None, verbosity, **kwargs)
 
 signals.post_syncdb.connect(update_contenttypes)
 
