Index: django/db/models/fields/related.py
===================================================================
--- django/db/models/fields/related.py	(revision 10189)
+++ django/db/models/fields/related.py	(working copy)
@@ -332,6 +332,8 @@
 
             def add(self, *objs):
                 for obj in objs:
+                    if not isinstance(obj, self.model):
+                        raise TypeError, "'%s' instance expected" % self.model._meta.object_name
                     setattr(obj, rel_field.name, instance)
                     obj.save()
             add.alters_data = True
@@ -452,11 +454,14 @@
 
             # If there aren't any objects, there is nothing to do.
             if objs:
+                from django.db.models.base import Model
                 # Check that all the objects are of the right type
                 new_ids = set()
                 for obj in objs:
                     if isinstance(obj, self.model):
                         new_ids.add(obj._get_pk_val())
+                    elif isinstance(obj, Model):
+                        raise TypeError, "'%s' instance expected" % self.model._meta.object_name
                     else:
                         new_ids.add(obj)
                 # Add the newly created or already existing objects to the join table.
Index: django/contrib/contenttypes/generic.py
===================================================================
--- django/contrib/contenttypes/generic.py	(revision 10189)
+++ django/contrib/contenttypes/generic.py	(working copy)
@@ -253,6 +253,8 @@
 
         def add(self, *objs):
             for obj in objs:
+                if not isinstance(obj, self.model):
+                    raise TypeError, "'%s' instance expected" % self.model._meta.object_name
                 setattr(obj, self.content_type_field_name, self.content_type)
                 setattr(obj, self.object_id_field_name, self.pk_val)
                 obj.save()
Index: tests/modeltests/many_to_many/models.py
===================================================================
--- tests/modeltests/many_to_many/models.py	(revision 10189)
+++ tests/modeltests/many_to_many/models.py	(working copy)
@@ -61,6 +61,12 @@
 # Adding a second time is OK
 >>> a2.publications.add(p3)
 
+# Adding an object of the wrong type raises TypeError
+>>> a2.publications.add(a1)
+Traceback (most recent call last):
+...
+TypeError: 'Publication' instance expected
+
 # Add a Publication directly via publications.add by using keyword arguments.
 >>> new_publication = a2.publications.create(title='Highlights for Children')
 
Index: tests/modeltests/many_to_one/models.py
===================================================================
--- tests/modeltests/many_to_one/models.py	(revision 10189)
+++ tests/modeltests/many_to_one/models.py	(working copy)
@@ -72,6 +72,13 @@
 >>> r2.article_set.add(new_article2)
 >>> new_article2.reporter.id
 2
+
+# Adding an object of the wrong type raises TypeError
+>>> r.article_set.add(r2)
+Traceback (most recent call last):
+...
+TypeError: 'Article' instance expected
+
 >>> r.article_set.all()
 [<Article: John's second story>, <Article: This is a test>]
 >>> r2.article_set.all()
