diff --git a/gi-gtk-declarative.cabal b/gi-gtk-declarative.cabal
--- a/gi-gtk-declarative.cabal
+++ b/gi-gtk-declarative.cabal
@@ -1,5 +1,5 @@
 name:                 gi-gtk-declarative
-version:              0.4.1
+version:              0.4.2
 synopsis:             Declarative GTK+ programming in Haskell
 description:          A declarative programming model for GTK+ user
                       interfaces, implementing support for various widgets
diff --git a/src/GI/Gtk/Declarative/Bin.hs b/src/GI/Gtk/Declarative/Bin.hs
--- a/src/GI/Gtk/Declarative/Bin.hs
+++ b/src/GI/Gtk/Declarative/Bin.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
 {-# LANGUAGE GADTs                 #-}
+{-# LANGUAGE LambdaCase            #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedLabels      #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
@@ -68,8 +69,8 @@
 -- Patchable
 --
 
-instance Gtk.IsBin parent => Patchable (Bin parent) where
-  create (Bin ctor attrs child) = do
+instance (Gtk.IsBin parent) => Patchable (Bin parent) where
+  create (Bin (ctor :: Gtk.ManagedPtr w -> w) attrs child) = do
     let collected = collectAttributes attrs
     widget' <- Gtk.new ctor (constructProperties collected)
     Gtk.widgetShow widget'
@@ -81,6 +82,7 @@
 
     childState <- create child
     childWidget <- someStateWidget childState
+    maybe (pure ()) Gtk.widgetDestroy =<< Gtk.binGetChild widget'
     Gtk.containerAdd widget' childWidget
     return (SomeState (StateTreeBin (StateTreeNode widget' sc collected ()) childState))
 
@@ -104,6 +106,7 @@
               newChildState <- createNew
               childWidget <- someStateWidget newChildState
               Gtk.widgetShow childWidget
+              maybe (pure ()) Gtk.widgetDestroy =<< Gtk.binGetChild binWidget
               Gtk.containerAdd binWidget childWidget
               return (SomeState (StateTreeBin top' newChildState))
             Keep -> return (SomeState st)
diff --git a/src/GI/Gtk/Declarative/Container.hs b/src/GI/Gtk/Declarative/Container.hs
--- a/src/GI/Gtk/Declarative/Container.hs
+++ b/src/GI/Gtk/Declarative/Container.hs
@@ -1,7 +1,5 @@
 {-# OPTIONS_GHC -fno-warn-unticked-promoted-constructors #-}
 {-# LANGUAGE DataKinds             #-}
-{-# LANGUAGE DefaultSignatures     #-}
-{-# LANGUAGE DeriveFunctor         #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
 {-# LANGUAGE GADTs                 #-}
diff --git a/src/GI/Gtk/Declarative/Container/Box.hs b/src/GI/Gtk/Declarative/Container/Box.hs
--- a/src/GI/Gtk/Declarative/Container/Box.hs
+++ b/src/GI/Gtk/Declarative/Container/Box.hs
@@ -1,10 +1,11 @@
-{-# OPTIONS_GHC -fno-warn-unticked-promoted-constructors -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE DeriveFunctor         #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
 {-# LANGUAGE GADTs                 #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE NamedFieldPuns        #-}
 {-# LANGUAGE OverloadedLabels      #-}
 {-# LANGUAGE RecordWildCards       #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
@@ -56,3 +57,11 @@
   subscribe BoxChild{..} = subscribe child
 
 instance ToChildren Gtk.Box Vector BoxChild
+
+instance IsContainer Gtk.Box BoxChild where
+  appendChild box BoxChild {properties = BoxChildProperties {expand, fill, padding}} widget' =
+    Gtk.boxPackStart box widget' expand fill padding
+  replaceChild box boxChild' i old new = do
+    Gtk.widgetDestroy old
+    appendChild box boxChild' new
+    Gtk.boxReorderChild box new i
diff --git a/src/GI/Gtk/Declarative/Container/ListBox.hs b/src/GI/Gtk/Declarative/Container/ListBox.hs
--- a/src/GI/Gtk/Declarative/Container/ListBox.hs
+++ b/src/GI/Gtk/Declarative/Container/ListBox.hs
@@ -11,4 +11,11 @@
 import           GI.Gtk.Declarative.Bin
 import           GI.Gtk.Declarative.Container.Class
 
+instance IsContainer Gtk.ListBox (Bin Gtk.ListBoxRow) where
+  appendChild box _ widget' =
+    Gtk.listBoxInsert box widget' (-1)
+  replaceChild box _ i old new = do
+    Gtk.widgetDestroy old
+    Gtk.listBoxInsert box new i
+
 instance ToChildren Gtk.ListBox Vector (Bin Gtk.ListBoxRow)
diff --git a/src/GI/Gtk/Declarative/Container/Patch.hs b/src/GI/Gtk/Declarative/Container/Patch.hs
--- a/src/GI/Gtk/Declarative/Container/Patch.hs
+++ b/src/GI/Gtk/Declarative/Container/Patch.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fno-warn-unticked-promoted-constructors -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE FlexibleContexts      #-}
@@ -9,7 +9,6 @@
 {-# LANGUAGE NamedFieldPuns        #-}
 {-# LANGUAGE OverloadedLabels      #-}
 {-# LANGUAGE OverloadedLists       #-}
-{-# LANGUAGE OverloadedStrings     #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
 {-# LANGUAGE TypeFamilies          #-}
 {-# LANGUAGE TypeOperators         #-}
@@ -26,8 +25,6 @@
 import qualified Data.Vector                        as Vector
 import qualified GI.Gtk                             as Gtk
 
-import           GI.Gtk.Declarative.Bin
-import           GI.Gtk.Declarative.Container.Box
 import           GI.Gtk.Declarative.Container.Class
 import           GI.Gtk.Declarative.Patch
 import           GI.Gtk.Declarative.State
@@ -114,18 +111,3 @@
 
 padMaybes :: Int -> Vector a -> Vector (Maybe a)
 padMaybes len xs = Vector.generate len (xs !?)
-
-instance IsContainer Gtk.ListBox (Bin Gtk.ListBoxRow) where
-  appendChild box _ widget' =
-    Gtk.listBoxInsert box widget' (-1)
-  replaceChild box _ i old new = do
-    Gtk.widgetDestroy old
-    Gtk.listBoxInsert box new i
-
-instance IsContainer Gtk.Box BoxChild where
-  appendChild box BoxChild {properties = BoxChildProperties {expand, fill, padding}} widget' =
-    Gtk.boxPackStart box widget' expand fill padding
-  replaceChild box boxChild' i old new = do
-    Gtk.widgetDestroy old
-    appendChild box boxChild' new
-    Gtk.boxReorderChild box new i
diff --git a/src/GI/Gtk/Declarative/Widget.hs b/src/GI/Gtk/Declarative/Widget.hs
--- a/src/GI/Gtk/Declarative/Widget.hs
+++ b/src/GI/Gtk/Declarative/Widget.hs
@@ -55,8 +55,13 @@
 -- some specifically typed widget, depending on the context in which it's
 -- used.
 class FromWidget widget target where
-  fromWidget :: (Typeable widget, Typeable event) => widget event -> target event
+  fromWidget :: widget event -> target event
 
-instance (Patchable (parent child), Functor (parent child), EventSource (parent child))
+instance ( Typeable parent
+         , Typeable child
+         , Patchable (parent child)
+         , Functor (parent child)
+         , EventSource (parent child)
+         )
          => FromWidget (parent child) Widget where
   fromWidget = Widget
