diff --git a/gtk/a11y/gtkspinbuttonaccessible.c b/gtk/a11y/gtkspinbuttonaccessible.c
index d344f4e..0e21838 100644
--- a/gtk/a11y/gtkspinbuttonaccessible.c
+++ b/gtk/a11y/gtkspinbuttonaccessible.c
@@ -42,6 +42,21 @@ gtk_spin_button_accessible_value_changed (GtkAdjustment *adjustment,
 }
 
 static void
+gtk_spin_button_accessible_handler_disconnect(GtkWidget *object,
+					      gpointer   user_data)
+{
+  GtkAdjustment *adjustment;
+
+  adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object));
+
+  if (adjustment) {
+    g_signal_handlers_disconnect_by_func (adjustment,
+					  gtk_spin_button_accessible_value_changed,
+					  user_data);
+  }
+}
+
+static void
 gtk_spin_button_accessible_initialize (AtkObject *obj,
                                        gpointer  data)
 {
@@ -50,11 +65,16 @@ gtk_spin_button_accessible_initialize (AtkObject *obj,
   ATK_OBJECT_CLASS (gtk_spin_button_accessible_parent_class)->initialize (obj, data);
 
   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (data));
-  if (adjustment)
+  if (adjustment) {
     g_signal_connect (adjustment,
                       "value-changed",
                       G_CALLBACK (gtk_spin_button_accessible_value_changed),
                       obj);
+    g_signal_connect (data,
+                      "destroy",
+                      G_CALLBACK (gtk_spin_button_accessible_handler_disconnect),
+                      obj);
+  }
 
   obj->role = ATK_ROLE_SPIN_BUTTON;
 }
@@ -74,6 +94,10 @@ gtk_spin_button_accessible_notify_gtk (GObject    *obj,
       g_signal_connect (adjustment, "value-changed",
                         G_CALLBACK (gtk_spin_button_accessible_value_changed),
                         spin_button);
+      g_signal_connect (widget,
+                        "destroy",
+                        G_CALLBACK (gtk_spin_button_accessible_handler_disconnect),
+                        obj);
     }
   else
     GTK_WIDGET_ACCESSIBLE_CLASS (gtk_spin_button_accessible_parent_class)->notify_gtk (obj, pspec);
