diff --git a/gobject/gbinding.c b/gobject/gbinding.c
index c73c4e6..fe28bcd 100644
--- a/gobject/gbinding.c
+++ b/gobject/gbinding.c
@@ -231,6 +231,16 @@ weak_unbind (gpointer  user_data,
 {
   GBinding *binding = user_data;
 
+  if (binding->source == binding->target)
+    {
+      binding->source = NULL;
+      binding->target = NULL;
+
+      g_object_unref (binding);
+
+      return;
+    }
+
   /* if what went away was the source, unset it so that GBinding::finalize
    * does not try to access it; otherwise, disconnect everything and remove
    * the GBinding instance from the object's qdata
@@ -575,9 +585,11 @@ g_binding_constructed (GObject *gobject)
                                                G_CALLBACK (on_target_notify),
                                                binding);
 
-  g_object_weak_ref (binding->target, weak_unbind, binding);
-  add_binding_qdata (binding->target, binding);
-
+  if (binding->source != binding->target)
+    {
+      g_object_weak_ref (binding->target, weak_unbind, binding);
+      add_binding_qdata (binding->target, binding);
+    }
 }
 
 static void
