diff --git a/GI/Gtk/Callbacks.hs b/GI/Gtk/Callbacks.hs
--- a/GI/Gtk/Callbacks.hs
+++ b/GI/Gtk/Callbacks.hs
@@ -1390,7 +1390,7 @@
     Ptr () ->
     IO CInt
 recentFilterFuncWrapper funptrptr _cb filterInfo _ = do
-    filterInfo' <- (newPtr 56 RecentFilterInfo) filterInfo
+    filterInfo' <- (newPtr RecentFilterInfo) filterInfo
     result <- _cb  filterInfo'
     maybeReleaseFunPtr funptrptr
     let result' = (fromIntegral . fromEnum) result
@@ -1852,7 +1852,7 @@
     IO Int32
 keySnoopFuncWrapper funptrptr _cb grabWidget event _ = do
     grabWidget' <- (newObject Widget) grabWidget
-    event' <- (newPtr 56 Gdk.EventKey) event
+    event' <- (newPtr Gdk.EventKey) event
     result <- _cb  grabWidget' event'
     maybeReleaseFunPtr funptrptr
     return result
@@ -2060,7 +2060,7 @@
     Ptr () ->
     IO CInt
 fileFilterFuncWrapper funptrptr _cb filterInfo _ = do
-    filterInfo' <- (newPtr 40 FileFilterInfo) filterInfo
+    filterInfo' <- (newPtr FileFilterInfo) filterInfo
     result <- _cb  filterInfo'
     maybeReleaseFunPtr funptrptr
     let result' = (fromIntegral . fromEnum) result
@@ -2287,9 +2287,8 @@
         if atoms == nullPtr
         then return Nothing
         else do
-            -- XXX Wrapping a foreign struct/union with no known destructor, leak?
             atoms' <- (unpackPtrArrayWithLength nAtoms) atoms
-            atoms'' <- mapM (\x -> Gdk.Atom <$> newForeignPtr_ x) atoms'
+            atoms'' <- mapM (newPtr Gdk.Atom) atoms'
             return $ Just atoms''
     _cb  clipboard' maybeAtoms
     maybeReleaseFunPtr funptrptr
@@ -2331,8 +2330,7 @@
     IO ()
 clipboardRichTextReceivedFuncWrapper funptrptr _cb clipboard format text length_ _ = do
     clipboard' <- (newObject Clipboard) clipboard
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    format' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) format
+    format' <- (newPtr Gdk.Atom) format
     maybeText <-
         if text == nullPtr
         then return Nothing
@@ -2833,7 +2831,7 @@
     Ptr () ->
     IO CInt
 accelGroupFindFuncWrapper funptrptr _cb key closure _ = do
-    key' <- (newPtr 12 AccelKey) key
+    key' <- (newPtr AccelKey) key
     closure' <- (newBoxed Closure) closure
     result <- _cb  key' closure'
     maybeReleaseFunPtr funptrptr
diff --git a/GI/Gtk/Objects/AccelGroup.hs b/GI/Gtk/Objects/AccelGroup.hs
--- a/GI/Gtk/Objects/AccelGroup.hs
+++ b/GI/Gtk/Objects/AccelGroup.hs
@@ -594,7 +594,7 @@
     let data_ = nullPtr
     result <- gtk_accel_group_find _obj' findFunc' data_
     checkUnexpectedReturnNULL "gtk_accel_group_find" result
-    result' <- (newPtr 12 AccelKey) result
+    result' <- (newPtr AccelKey) result
     safeFreeFunPtr $ castFunPtrToPtr findFunc'
     touchManagedPtr _obj
     return result'
@@ -716,7 +716,7 @@
     nEntries' <- peek nEntries
     checkUnexpectedReturnNULL "gtk_accel_group_query" result
     result' <- (unpackBlockArrayWithLength 32 nEntries') result
-    result'' <- mapM (newPtr 32 AccelGroupEntry) result'
+    result'' <- mapM (newPtr AccelGroupEntry) result'
     touchManagedPtr _obj
     freeMem nEntries
     return result''
diff --git a/GI/Gtk/Objects/Clipboard.hs b/GI/Gtk/Objects/Clipboard.hs
--- a/GI/Gtk/Objects/Clipboard.hs
+++ b/GI/Gtk/Objects/Clipboard.hs
@@ -287,7 +287,7 @@
     Ptr () ->
     IO ()
 clipboardOwnerChangeCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 56 Gdk.EventOwnerChange) event
+    event' <- (newPtr Gdk.EventOwnerChange) event
     _cb  event'
 
 onClipboardOwnerChange :: (GObject a, MonadIO m) => a -> ClipboardOwnerChangeCallback -> m SignalHandlerId
@@ -838,8 +838,7 @@
         freeMem result'
         return result''
     format' <- peek format
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    format'' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) format'
+    format'' <- (newPtr Gdk.Atom) format'
     touchManagedPtr _obj
     touchManagedPtr buffer
     freeMem format
@@ -877,9 +876,8 @@
     nTargets' <- peek nTargets
     let result' = (/= 0) result
     targets' <- peek targets
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
     targets'' <- (unpackPtrArrayWithLength nTargets') targets'
-    targets''' <- mapM (\x -> Gdk.Atom <$> newForeignPtr_ x) targets''
+    targets''' <- mapM (newPtr Gdk.Atom) targets''
     freeMem targets'
     touchManagedPtr _obj
     freeMem targets
diff --git a/GI/Gtk/Objects/Entry.hs b/GI/Gtk/Objects/Entry.hs
--- a/GI/Gtk/Objects/Entry.hs
+++ b/GI/Gtk/Objects/Entry.hs
@@ -1609,7 +1609,7 @@
     IO ()
 entryIconPressCallbackWrapper _cb _ iconPos event _ = do
     let iconPos' = (toEnum . fromIntegral) iconPos
-    event' <- (newPtr 80 Gdk.EventButton) event
+    event' <- (newPtr Gdk.EventButton) event
     _cb  iconPos' event'
 
 onEntryIconPress :: (GObject a, MonadIO m) => a -> EntryIconPressCallback -> m SignalHandlerId
@@ -1655,7 +1655,7 @@
     IO ()
 entryIconReleaseCallbackWrapper _cb _ iconPos event _ = do
     let iconPos' = (toEnum . fromIntegral) iconPos
-    event' <- (newPtr 80 Gdk.EventButton) event
+    event' <- (newPtr Gdk.EventButton) event
     _cb  iconPos' event'
 
 onEntryIconRelease :: (GObject a, MonadIO m) => a -> EntryIconReleaseCallback -> m SignalHandlerId
diff --git a/GI/Gtk/Objects/StatusIcon.hs b/GI/Gtk/Objects/StatusIcon.hs
--- a/GI/Gtk/Objects/StatusIcon.hs
+++ b/GI/Gtk/Objects/StatusIcon.hs
@@ -552,7 +552,7 @@
     Ptr () ->
     IO CInt
 statusIconButtonPressEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 80 Gdk.EventButton) event
+    event' <- (newPtr Gdk.EventButton) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -596,7 +596,7 @@
     Ptr () ->
     IO CInt
 statusIconButtonReleaseEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 80 Gdk.EventButton) event
+    event' <- (newPtr Gdk.EventButton) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -738,7 +738,7 @@
     Ptr () ->
     IO CInt
 statusIconScrollEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 88 Gdk.EventScroll) event
+    event' <- (newPtr Gdk.EventScroll) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
diff --git a/GI/Gtk/Objects/TextBuffer.hs b/GI/Gtk/Objects/TextBuffer.hs
--- a/GI/Gtk/Objects/TextBuffer.hs
+++ b/GI/Gtk/Objects/TextBuffer.hs
@@ -2311,9 +2311,8 @@
     result <- gtk_text_buffer_get_deserialize_formats _obj' nFormats
     nFormats' <- peek nFormats
     checkUnexpectedReturnNULL "gtk_text_buffer_get_deserialize_formats" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
     result' <- (unpackPtrArrayWithLength nFormats') result
-    result'' <- mapM (\x -> Gdk.Atom <$> newForeignPtr_ x) result'
+    result'' <- mapM (newPtr Gdk.Atom) result'
     freeMem result
     touchManagedPtr _obj
     freeMem nFormats
@@ -2814,9 +2813,8 @@
     result <- gtk_text_buffer_get_serialize_formats _obj' nFormats
     nFormats' <- peek nFormats
     checkUnexpectedReturnNULL "gtk_text_buffer_get_serialize_formats" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
     result' <- (unpackPtrArrayWithLength nFormats') result
-    result'' <- mapM (\x -> Gdk.Atom <$> newForeignPtr_ x) result'
+    result'' <- mapM (newPtr Gdk.Atom) result'
     freeMem result
     touchManagedPtr _obj
     freeMem nFormats
@@ -3478,8 +3476,7 @@
     let userDataDestroy = safeFreeFunPtrPtr
     result <- gtk_text_buffer_register_deserialize_format _obj' mimeType' function' userData userDataDestroy
     checkUnexpectedReturnNULL "gtk_text_buffer_register_deserialize_format" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Gdk.Atom) result
     touchManagedPtr _obj
     freeMem mimeType'
     return result'
@@ -3516,8 +3513,7 @@
             return jTagsetName'
     result <- gtk_text_buffer_register_deserialize_tagset _obj' maybeTagsetName
     checkUnexpectedReturnNULL "gtk_text_buffer_register_deserialize_tagset" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Gdk.Atom) result
     touchManagedPtr _obj
     freeMem maybeTagsetName
     return result'
@@ -3557,8 +3553,7 @@
     let userDataDestroy = safeFreeFunPtrPtr
     result <- gtk_text_buffer_register_serialize_format _obj' mimeType' function' userData userDataDestroy
     checkUnexpectedReturnNULL "gtk_text_buffer_register_serialize_format" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Gdk.Atom) result
     touchManagedPtr _obj
     freeMem mimeType'
     return result'
@@ -3595,8 +3590,7 @@
             return jTagsetName'
     result <- gtk_text_buffer_register_serialize_tagset _obj' maybeTagsetName
     checkUnexpectedReturnNULL "gtk_text_buffer_register_serialize_tagset" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Gdk.Atom) result
     touchManagedPtr _obj
     freeMem maybeTagsetName
     return result'
diff --git a/GI/Gtk/Objects/Widget.hs b/GI/Gtk/Objects/Widget.hs
--- a/GI/Gtk/Objects/Widget.hs
+++ b/GI/Gtk/Objects/Widget.hs
@@ -2860,7 +2860,7 @@
     Ptr () ->
     IO CInt
 widgetButtonPressEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 80 Gdk.EventButton) event
+    event' <- (newPtr Gdk.EventButton) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -2904,7 +2904,7 @@
     Ptr () ->
     IO CInt
 widgetButtonReleaseEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 80 Gdk.EventButton) event
+    event' <- (newPtr Gdk.EventButton) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -3071,7 +3071,7 @@
     Ptr () ->
     IO CInt
 widgetConfigureEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 40 Gdk.EventConfigure) event
+    event' <- (newPtr Gdk.EventConfigure) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -3115,7 +3115,7 @@
     Ptr () ->
     IO CInt
 widgetDamageEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 56 Gdk.EventExpose) event
+    event' <- (newPtr Gdk.EventExpose) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -3806,7 +3806,7 @@
     Ptr () ->
     IO CInt
 widgetEnterNotifyEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 88 Gdk.EventCrossing) event
+    event' <- (newPtr Gdk.EventCrossing) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -3980,7 +3980,7 @@
     Ptr () ->
     IO CInt
 widgetFocusInEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 24 Gdk.EventFocus) event
+    event' <- (newPtr Gdk.EventFocus) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4024,7 +4024,7 @@
     Ptr () ->
     IO CInt
 widgetFocusOutEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 24 Gdk.EventFocus) event
+    event' <- (newPtr Gdk.EventFocus) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4068,7 +4068,7 @@
     Ptr () ->
     IO CInt
 widgetGrabBrokenEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 40 Gdk.EventGrabBroken) event
+    event' <- (newPtr Gdk.EventGrabBroken) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4277,7 +4277,7 @@
     Ptr () ->
     IO CInt
 widgetKeyPressEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 56 Gdk.EventKey) event
+    event' <- (newPtr Gdk.EventKey) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4321,7 +4321,7 @@
     Ptr () ->
     IO CInt
 widgetKeyReleaseEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 56 Gdk.EventKey) event
+    event' <- (newPtr Gdk.EventKey) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4409,7 +4409,7 @@
     Ptr () ->
     IO CInt
 widgetLeaveNotifyEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 88 Gdk.EventCrossing) event
+    event' <- (newPtr Gdk.EventCrossing) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4491,7 +4491,7 @@
     Ptr () ->
     IO CInt
 widgetMapEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 24 Gdk.EventAny) event
+    event' <- (newPtr Gdk.EventAny) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4579,7 +4579,7 @@
     Ptr () ->
     IO CInt
 widgetMotionNotifyEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 80 Gdk.EventMotion) event
+    event' <- (newPtr Gdk.EventMotion) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4752,7 +4752,7 @@
     Ptr () ->
     IO CInt
 widgetPropertyNotifyEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 40 Gdk.EventProperty) event
+    event' <- (newPtr Gdk.EventProperty) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4796,7 +4796,7 @@
     Ptr () ->
     IO CInt
 widgetProximityInEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 32 Gdk.EventProximity) event
+    event' <- (newPtr Gdk.EventProximity) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -4840,7 +4840,7 @@
     Ptr () ->
     IO CInt
 widgetProximityOutEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 32 Gdk.EventProximity) event
+    event' <- (newPtr Gdk.EventProximity) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -5023,7 +5023,7 @@
     Ptr () ->
     IO CInt
 widgetScrollEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 88 Gdk.EventScroll) event
+    event' <- (newPtr Gdk.EventScroll) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -5067,7 +5067,7 @@
     Ptr () ->
     IO CInt
 widgetSelectionClearEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 64 Gdk.EventSelection) event
+    event' <- (newPtr Gdk.EventSelection) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -5159,7 +5159,7 @@
     Ptr () ->
     IO CInt
 widgetSelectionNotifyEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 64 Gdk.EventSelection) event
+    event' <- (newPtr Gdk.EventSelection) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -5248,7 +5248,7 @@
     Ptr () ->
     IO CInt
 widgetSelectionRequestEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 64 Gdk.EventSelection) event
+    event' <- (newPtr Gdk.EventSelection) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -5667,7 +5667,7 @@
     Ptr () ->
     IO CInt
 widgetUnmapEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 24 Gdk.EventAny) event
+    event' <- (newPtr Gdk.EventAny) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -5749,7 +5749,7 @@
     Ptr () ->
     IO CInt
 widgetVisibilityNotifyEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 24 Gdk.EventVisibility) event
+    event' <- (newPtr Gdk.EventVisibility) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -5793,7 +5793,7 @@
     Ptr () ->
     IO CInt
 widgetWindowStateEventCallbackWrapper _cb _ event _ = do
-    event' <- (newPtr 32 Gdk.EventWindowState) event
+    event' <- (newPtr Gdk.EventWindowState) event
     result <- _cb  event'
     let result' = (fromIntegral . fromEnum) result
     return result'
@@ -8017,8 +8017,7 @@
             return jTargetList'
     result <- gtk_drag_dest_find_target _obj' context' maybeTargetList
     checkUnexpectedReturnNULL "gtk_drag_dest_find_target" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Gdk.Atom) result
     touchManagedPtr _obj
     touchManagedPtr context
     whenJust targetList touchManagedPtr
@@ -9508,8 +9507,7 @@
     let _obj' = unsafeManagedPtrCastPtr _obj
     result <- gtk_widget_get_font_options _obj'
     maybeResult <- convertIfNonNull result $ \result' -> do
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        result'' <- (\x -> Cairo.FontOptions <$> newForeignPtr_ x) result'
+        result'' <- (newPtr Cairo.FontOptions) result'
         return result''
     touchManagedPtr _obj
     return maybeResult
diff --git a/GI/Gtk/Structs/AccelGroupEntry.hs b/GI/Gtk/Structs/AccelGroupEntry.hs
--- a/GI/Gtk/Structs/AccelGroupEntry.hs
+++ b/GI/Gtk/Structs/AccelGroupEntry.hs
@@ -51,9 +51,14 @@
 import GI.Gtk.Callbacks
 
 newtype AccelGroupEntry = AccelGroupEntry (ForeignPtr AccelGroupEntry)
+instance WrappedPtr AccelGroupEntry where
+    wrappedPtrCalloc = callocBytes 32
+    wrappedPtrCopy = copyPtr 32
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `AccelGroupEntry` struct initialized to zero.
 newZeroAccelGroupEntry :: MonadIO m => m AccelGroupEntry
-newZeroAccelGroupEntry = liftIO $ callocBytes 32 >>= wrapPtr AccelGroupEntry
+newZeroAccelGroupEntry = liftIO $ wrappedPtrCalloc >>= wrapPtr AccelGroupEntry
 
 instance tag ~ 'AttrSet => Constructible AccelGroupEntry tag where
     new _ attrs = do
@@ -69,7 +74,7 @@
 accelGroupEntryReadKey s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr AccelKey)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 12 AccelKey) val'
+        val'' <- (newPtr AccelKey) val'
         return val''
     return result
 
diff --git a/GI/Gtk/Structs/AccelGroupEntry.hs-boot b/GI/Gtk/Structs/AccelGroupEntry.hs-boot
--- a/GI/Gtk/Structs/AccelGroupEntry.hs-boot
+++ b/GI/Gtk/Structs/AccelGroupEntry.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype AccelGroupEntry = AccelGroupEntry (ForeignPtr AccelGroupEntry)
+instance WrappedPtr AccelGroupEntry where
diff --git a/GI/Gtk/Structs/AccelKey.hs b/GI/Gtk/Structs/AccelKey.hs
--- a/GI/Gtk/Structs/AccelKey.hs
+++ b/GI/Gtk/Structs/AccelKey.hs
@@ -50,9 +50,14 @@
 import qualified GI.Gdk as Gdk
 
 newtype AccelKey = AccelKey (ForeignPtr AccelKey)
+instance WrappedPtr AccelKey where
+    wrappedPtrCalloc = callocBytes 12
+    wrappedPtrCopy = copyPtr 12
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `AccelKey` struct initialized to zero.
 newZeroAccelKey :: MonadIO m => m AccelKey
-newZeroAccelKey = liftIO $ callocBytes 12 >>= wrapPtr AccelKey
+newZeroAccelKey = liftIO $ wrappedPtrCalloc >>= wrapPtr AccelKey
 
 instance tag ~ 'AttrSet => Constructible AccelKey tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/AccelKey.hs-boot b/GI/Gtk/Structs/AccelKey.hs-boot
--- a/GI/Gtk/Structs/AccelKey.hs-boot
+++ b/GI/Gtk/Structs/AccelKey.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype AccelKey = AccelKey (ForeignPtr AccelKey)
+instance WrappedPtr AccelKey where
diff --git a/GI/Gtk/Structs/ActionEntry.hs b/GI/Gtk/Structs/ActionEntry.hs
--- a/GI/Gtk/Structs/ActionEntry.hs
+++ b/GI/Gtk/Structs/ActionEntry.hs
@@ -69,9 +69,14 @@
 import GI.Gtk.Callbacks
 
 newtype ActionEntry = ActionEntry (ForeignPtr ActionEntry)
+instance WrappedPtr ActionEntry where
+    wrappedPtrCalloc = callocBytes 48
+    wrappedPtrCopy = copyPtr 48
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `ActionEntry` struct initialized to zero.
 newZeroActionEntry :: MonadIO m => m ActionEntry
-newZeroActionEntry = liftIO $ callocBytes 48 >>= wrapPtr ActionEntry
+newZeroActionEntry = liftIO $ wrappedPtrCalloc >>= wrapPtr ActionEntry
 
 instance tag ~ 'AttrSet => Constructible ActionEntry tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/ActionEntry.hs-boot b/GI/Gtk/Structs/ActionEntry.hs-boot
--- a/GI/Gtk/Structs/ActionEntry.hs-boot
+++ b/GI/Gtk/Structs/ActionEntry.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype ActionEntry = ActionEntry (ForeignPtr ActionEntry)
+instance WrappedPtr ActionEntry where
diff --git a/GI/Gtk/Structs/BindingArg.hs b/GI/Gtk/Structs/BindingArg.hs
--- a/GI/Gtk/Structs/BindingArg.hs
+++ b/GI/Gtk/Structs/BindingArg.hs
@@ -41,9 +41,14 @@
 import GI.Gtk.Callbacks
 
 newtype BindingArg = BindingArg (ForeignPtr BindingArg)
+instance WrappedPtr BindingArg where
+    wrappedPtrCalloc = callocBytes 8
+    wrappedPtrCopy = copyPtr 8
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `BindingArg` struct initialized to zero.
 newZeroBindingArg :: MonadIO m => m BindingArg
-newZeroBindingArg = liftIO $ callocBytes 8 >>= wrapPtr BindingArg
+newZeroBindingArg = liftIO $ wrappedPtrCalloc >>= wrapPtr BindingArg
 
 instance tag ~ 'AttrSet => Constructible BindingArg tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/BindingArg.hs-boot b/GI/Gtk/Structs/BindingArg.hs-boot
--- a/GI/Gtk/Structs/BindingArg.hs-boot
+++ b/GI/Gtk/Structs/BindingArg.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype BindingArg = BindingArg (ForeignPtr BindingArg)
+instance WrappedPtr BindingArg where
diff --git a/GI/Gtk/Structs/BindingEntry.hs b/GI/Gtk/Structs/BindingEntry.hs
--- a/GI/Gtk/Structs/BindingEntry.hs
+++ b/GI/Gtk/Structs/BindingEntry.hs
@@ -113,9 +113,14 @@
 import qualified GI.Gdk as Gdk
 
 newtype BindingEntry = BindingEntry (ForeignPtr BindingEntry)
+instance WrappedPtr BindingEntry where
+    wrappedPtrCalloc = callocBytes 56
+    wrappedPtrCopy = copyPtr 56
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `BindingEntry` struct initialized to zero.
 newZeroBindingEntry :: MonadIO m => m BindingEntry
-newZeroBindingEntry = liftIO $ callocBytes 56 >>= wrapPtr BindingEntry
+newZeroBindingEntry = liftIO $ wrappedPtrCalloc >>= wrapPtr BindingEntry
 
 instance tag ~ 'AttrSet => Constructible BindingEntry tag where
     new _ attrs = do
@@ -183,7 +188,7 @@
 bindingEntryReadBindingSet s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 8) :: IO (Ptr BindingSet)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 64 BindingSet) val'
+        val'' <- (newPtr BindingSet) val'
         return val''
     return result
 
@@ -290,7 +295,7 @@
 bindingEntryReadSetNext s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 32) :: IO (Ptr BindingEntry)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 56 BindingEntry) val'
+        val'' <- (newPtr BindingEntry) val'
         return val''
     return result
 
@@ -322,7 +327,7 @@
 bindingEntryReadHashNext s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 40) :: IO (Ptr BindingEntry)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 56 BindingEntry) val'
+        val'' <- (newPtr BindingEntry) val'
         return val''
     return result
 
@@ -354,7 +359,7 @@
 bindingEntryReadSignals s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 48) :: IO (Ptr BindingSignal)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 32 BindingSignal) val'
+        val'' <- (newPtr BindingSignal) val'
         return val''
     return result
 
diff --git a/GI/Gtk/Structs/BindingEntry.hs-boot b/GI/Gtk/Structs/BindingEntry.hs-boot
--- a/GI/Gtk/Structs/BindingEntry.hs-boot
+++ b/GI/Gtk/Structs/BindingEntry.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype BindingEntry = BindingEntry (ForeignPtr BindingEntry)
+instance WrappedPtr BindingEntry where
diff --git a/GI/Gtk/Structs/BindingSet.hs b/GI/Gtk/Structs/BindingSet.hs
--- a/GI/Gtk/Structs/BindingSet.hs
+++ b/GI/Gtk/Structs/BindingSet.hs
@@ -111,9 +111,14 @@
 import qualified GI.Gdk as Gdk
 
 newtype BindingSet = BindingSet (ForeignPtr BindingSet)
+instance WrappedPtr BindingSet where
+    wrappedPtrCalloc = callocBytes 64
+    wrappedPtrCopy = copyPtr 64
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `BindingSet` struct initialized to zero.
 newZeroBindingSet :: MonadIO m => m BindingSet
-newZeroBindingSet = liftIO $ callocBytes 64 >>= wrapPtr BindingSet
+newZeroBindingSet = liftIO $ wrappedPtrCalloc >>= wrapPtr BindingSet
 
 instance tag ~ 'AttrSet => Constructible BindingSet tag where
     new _ attrs = do
@@ -276,7 +281,7 @@
 bindingSetReadEntries s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 40) :: IO (Ptr BindingEntry)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 56 BindingEntry) val'
+        val'' <- (newPtr BindingEntry) val'
         return val''
     return result
 
@@ -308,7 +313,7 @@
 bindingSetReadCurrent s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 48) :: IO (Ptr BindingEntry)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 56 BindingEntry) val'
+        val'' <- (newPtr BindingEntry) val'
         return val''
     return result
 
@@ -460,7 +465,7 @@
     setName' <- textToCString setName
     result <- gtk_binding_set_find setName'
     checkUnexpectedReturnNULL "gtk_binding_set_find" result
-    result' <- (newPtr 64 BindingSet) result
+    result' <- (newPtr BindingSet) result
     freeMem setName'
     return result'
 
diff --git a/GI/Gtk/Structs/BindingSet.hs-boot b/GI/Gtk/Structs/BindingSet.hs-boot
--- a/GI/Gtk/Structs/BindingSet.hs-boot
+++ b/GI/Gtk/Structs/BindingSet.hs-boot
@@ -8,5 +8,6 @@
 import qualified Data.Map as Map
 
 newtype BindingSet = BindingSet (ForeignPtr BindingSet)
+instance WrappedPtr BindingSet where
 data BindingSetActivateMethodInfo
 data BindingSetAddPathMethodInfo
diff --git a/GI/Gtk/Structs/BindingSignal.hs b/GI/Gtk/Structs/BindingSignal.hs
--- a/GI/Gtk/Structs/BindingSignal.hs
+++ b/GI/Gtk/Structs/BindingSignal.hs
@@ -55,9 +55,14 @@
 import GI.Gtk.Callbacks
 
 newtype BindingSignal = BindingSignal (ForeignPtr BindingSignal)
+instance WrappedPtr BindingSignal where
+    wrappedPtrCalloc = callocBytes 32
+    wrappedPtrCopy = copyPtr 32
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `BindingSignal` struct initialized to zero.
 newZeroBindingSignal :: MonadIO m => m BindingSignal
-newZeroBindingSignal = liftIO $ callocBytes 32 >>= wrapPtr BindingSignal
+newZeroBindingSignal = liftIO $ wrappedPtrCalloc >>= wrapPtr BindingSignal
 
 instance tag ~ 'AttrSet => Constructible BindingSignal tag where
     new _ attrs = do
@@ -73,7 +78,7 @@
 bindingSignalReadNext s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr BindingSignal)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 32 BindingSignal) val'
+        val'' <- (newPtr BindingSignal) val'
         return val''
     return result
 
diff --git a/GI/Gtk/Structs/BindingSignal.hs-boot b/GI/Gtk/Structs/BindingSignal.hs-boot
--- a/GI/Gtk/Structs/BindingSignal.hs-boot
+++ b/GI/Gtk/Structs/BindingSignal.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype BindingSignal = BindingSignal (ForeignPtr BindingSignal)
+instance WrappedPtr BindingSignal where
diff --git a/GI/Gtk/Structs/FileFilterInfo.hs b/GI/Gtk/Structs/FileFilterInfo.hs
--- a/GI/Gtk/Structs/FileFilterInfo.hs
+++ b/GI/Gtk/Structs/FileFilterInfo.hs
@@ -68,9 +68,14 @@
 import GI.Gtk.Callbacks
 
 newtype FileFilterInfo = FileFilterInfo (ForeignPtr FileFilterInfo)
+instance WrappedPtr FileFilterInfo where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `FileFilterInfo` struct initialized to zero.
 newZeroFileFilterInfo :: MonadIO m => m FileFilterInfo
-newZeroFileFilterInfo = liftIO $ callocBytes 40 >>= wrapPtr FileFilterInfo
+newZeroFileFilterInfo = liftIO $ wrappedPtrCalloc >>= wrapPtr FileFilterInfo
 
 instance tag ~ 'AttrSet => Constructible FileFilterInfo tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/FileFilterInfo.hs-boot b/GI/Gtk/Structs/FileFilterInfo.hs-boot
--- a/GI/Gtk/Structs/FileFilterInfo.hs-boot
+++ b/GI/Gtk/Structs/FileFilterInfo.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype FileFilterInfo = FileFilterInfo (ForeignPtr FileFilterInfo)
+instance WrappedPtr FileFilterInfo where
diff --git a/GI/Gtk/Structs/FixedChild.hs b/GI/Gtk/Structs/FixedChild.hs
--- a/GI/Gtk/Structs/FixedChild.hs
+++ b/GI/Gtk/Structs/FixedChild.hs
@@ -50,9 +50,14 @@
 import GI.Gtk.Callbacks
 
 newtype FixedChild = FixedChild (ForeignPtr FixedChild)
+instance WrappedPtr FixedChild where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `FixedChild` struct initialized to zero.
 newZeroFixedChild :: MonadIO m => m FixedChild
-newZeroFixedChild = liftIO $ callocBytes 16 >>= wrapPtr FixedChild
+newZeroFixedChild = liftIO $ wrappedPtrCalloc >>= wrapPtr FixedChild
 
 instance tag ~ 'AttrSet => Constructible FixedChild tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/FixedChild.hs-boot b/GI/Gtk/Structs/FixedChild.hs-boot
--- a/GI/Gtk/Structs/FixedChild.hs-boot
+++ b/GI/Gtk/Structs/FixedChild.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype FixedChild = FixedChild (ForeignPtr FixedChild)
+instance WrappedPtr FixedChild where
diff --git a/GI/Gtk/Structs/IMContextInfo.hs b/GI/Gtk/Structs/IMContextInfo.hs
--- a/GI/Gtk/Structs/IMContextInfo.hs
+++ b/GI/Gtk/Structs/IMContextInfo.hs
@@ -68,9 +68,14 @@
 import GI.Gtk.Callbacks
 
 newtype IMContextInfo = IMContextInfo (ForeignPtr IMContextInfo)
+instance WrappedPtr IMContextInfo where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `IMContextInfo` struct initialized to zero.
 newZeroIMContextInfo :: MonadIO m => m IMContextInfo
-newZeroIMContextInfo = liftIO $ callocBytes 40 >>= wrapPtr IMContextInfo
+newZeroIMContextInfo = liftIO $ wrappedPtrCalloc >>= wrapPtr IMContextInfo
 
 instance tag ~ 'AttrSet => Constructible IMContextInfo tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/IMContextInfo.hs-boot b/GI/Gtk/Structs/IMContextInfo.hs-boot
--- a/GI/Gtk/Structs/IMContextInfo.hs-boot
+++ b/GI/Gtk/Structs/IMContextInfo.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype IMContextInfo = IMContextInfo (ForeignPtr IMContextInfo)
+instance WrappedPtr IMContextInfo where
diff --git a/GI/Gtk/Structs/LabelSelectionInfo.hs b/GI/Gtk/Structs/LabelSelectionInfo.hs
--- a/GI/Gtk/Structs/LabelSelectionInfo.hs
+++ b/GI/Gtk/Structs/LabelSelectionInfo.hs
@@ -27,6 +27,12 @@
 import GI.Gtk.Callbacks
 
 newtype LabelSelectionInfo = LabelSelectionInfo (ForeignPtr LabelSelectionInfo)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr LabelSelectionInfo where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noLabelSelectionInfo :: Maybe LabelSelectionInfo
 noLabelSelectionInfo = Nothing
 
diff --git a/GI/Gtk/Structs/LabelSelectionInfo.hs-boot b/GI/Gtk/Structs/LabelSelectionInfo.hs-boot
--- a/GI/Gtk/Structs/LabelSelectionInfo.hs-boot
+++ b/GI/Gtk/Structs/LabelSelectionInfo.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype LabelSelectionInfo = LabelSelectionInfo (ForeignPtr LabelSelectionInfo)
+instance WrappedPtr LabelSelectionInfo where
diff --git a/GI/Gtk/Structs/PageRange.hs b/GI/Gtk/Structs/PageRange.hs
--- a/GI/Gtk/Structs/PageRange.hs
+++ b/GI/Gtk/Structs/PageRange.hs
@@ -45,9 +45,14 @@
 import GI.Gtk.Callbacks
 
 newtype PageRange = PageRange (ForeignPtr PageRange)
+instance WrappedPtr PageRange where
+    wrappedPtrCalloc = callocBytes 8
+    wrappedPtrCopy = copyPtr 8
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `PageRange` struct initialized to zero.
 newZeroPageRange :: MonadIO m => m PageRange
-newZeroPageRange = liftIO $ callocBytes 8 >>= wrapPtr PageRange
+newZeroPageRange = liftIO $ wrappedPtrCalloc >>= wrapPtr PageRange
 
 instance tag ~ 'AttrSet => Constructible PageRange tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/PageRange.hs-boot b/GI/Gtk/Structs/PageRange.hs-boot
--- a/GI/Gtk/Structs/PageRange.hs-boot
+++ b/GI/Gtk/Structs/PageRange.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype PageRange = PageRange (ForeignPtr PageRange)
+instance WrappedPtr PageRange where
diff --git a/GI/Gtk/Structs/RadioActionEntry.hs b/GI/Gtk/Structs/RadioActionEntry.hs
--- a/GI/Gtk/Structs/RadioActionEntry.hs
+++ b/GI/Gtk/Structs/RadioActionEntry.hs
@@ -75,9 +75,14 @@
 import GI.Gtk.Callbacks
 
 newtype RadioActionEntry = RadioActionEntry (ForeignPtr RadioActionEntry)
+instance WrappedPtr RadioActionEntry where
+    wrappedPtrCalloc = callocBytes 48
+    wrappedPtrCopy = copyPtr 48
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `RadioActionEntry` struct initialized to zero.
 newZeroRadioActionEntry :: MonadIO m => m RadioActionEntry
-newZeroRadioActionEntry = liftIO $ callocBytes 48 >>= wrapPtr RadioActionEntry
+newZeroRadioActionEntry = liftIO $ wrappedPtrCalloc >>= wrapPtr RadioActionEntry
 
 instance tag ~ 'AttrSet => Constructible RadioActionEntry tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/RadioActionEntry.hs-boot b/GI/Gtk/Structs/RadioActionEntry.hs-boot
--- a/GI/Gtk/Structs/RadioActionEntry.hs-boot
+++ b/GI/Gtk/Structs/RadioActionEntry.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype RadioActionEntry = RadioActionEntry (ForeignPtr RadioActionEntry)
+instance WrappedPtr RadioActionEntry where
diff --git a/GI/Gtk/Structs/RcContext.hs b/GI/Gtk/Structs/RcContext.hs
--- a/GI/Gtk/Structs/RcContext.hs
+++ b/GI/Gtk/Structs/RcContext.hs
@@ -27,6 +27,12 @@
 import GI.Gtk.Callbacks
 
 newtype RcContext = RcContext (ForeignPtr RcContext)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr RcContext where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noRcContext :: Maybe RcContext
 noRcContext = Nothing
 
diff --git a/GI/Gtk/Structs/RcContext.hs-boot b/GI/Gtk/Structs/RcContext.hs-boot
--- a/GI/Gtk/Structs/RcContext.hs-boot
+++ b/GI/Gtk/Structs/RcContext.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype RcContext = RcContext (ForeignPtr RcContext)
+instance WrappedPtr RcContext where
diff --git a/GI/Gtk/Structs/RcProperty.hs b/GI/Gtk/Structs/RcProperty.hs
--- a/GI/Gtk/Structs/RcProperty.hs
+++ b/GI/Gtk/Structs/RcProperty.hs
@@ -83,9 +83,14 @@
 import qualified GI.GLib as GLib
 
 newtype RcProperty = RcProperty (ForeignPtr RcProperty)
+instance WrappedPtr RcProperty where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `RcProperty` struct initialized to zero.
 newZeroRcProperty :: MonadIO m => m RcProperty
-newZeroRcProperty = liftIO $ callocBytes 40 >>= wrapPtr RcProperty
+newZeroRcProperty = liftIO $ wrappedPtrCalloc >>= wrapPtr RcProperty
 
 instance tag ~ 'AttrSet => Constructible RcProperty tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/RcProperty.hs-boot b/GI/Gtk/Structs/RcProperty.hs-boot
--- a/GI/Gtk/Structs/RcProperty.hs-boot
+++ b/GI/Gtk/Structs/RcProperty.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype RcProperty = RcProperty (ForeignPtr RcProperty)
+instance WrappedPtr RcProperty where
diff --git a/GI/Gtk/Structs/RecentData.hs b/GI/Gtk/Structs/RecentData.hs
--- a/GI/Gtk/Structs/RecentData.hs
+++ b/GI/Gtk/Structs/RecentData.hs
@@ -82,9 +82,14 @@
 import GI.Gtk.Callbacks
 
 newtype RecentData = RecentData (ForeignPtr RecentData)
+instance WrappedPtr RecentData where
+    wrappedPtrCalloc = callocBytes 56
+    wrappedPtrCopy = copyPtr 56
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `RecentData` struct initialized to zero.
 newZeroRecentData :: MonadIO m => m RecentData
-newZeroRecentData = liftIO $ callocBytes 56 >>= wrapPtr RecentData
+newZeroRecentData = liftIO $ wrappedPtrCalloc >>= wrapPtr RecentData
 
 instance tag ~ 'AttrSet => Constructible RecentData tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/RecentData.hs-boot b/GI/Gtk/Structs/RecentData.hs-boot
--- a/GI/Gtk/Structs/RecentData.hs-boot
+++ b/GI/Gtk/Structs/RecentData.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype RecentData = RecentData (ForeignPtr RecentData)
+instance WrappedPtr RecentData where
diff --git a/GI/Gtk/Structs/RecentFilterInfo.hs b/GI/Gtk/Structs/RecentFilterInfo.hs
--- a/GI/Gtk/Structs/RecentFilterInfo.hs
+++ b/GI/Gtk/Structs/RecentFilterInfo.hs
@@ -81,9 +81,14 @@
 import GI.Gtk.Callbacks
 
 newtype RecentFilterInfo = RecentFilterInfo (ForeignPtr RecentFilterInfo)
+instance WrappedPtr RecentFilterInfo where
+    wrappedPtrCalloc = callocBytes 56
+    wrappedPtrCopy = copyPtr 56
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `RecentFilterInfo` struct initialized to zero.
 newZeroRecentFilterInfo :: MonadIO m => m RecentFilterInfo
-newZeroRecentFilterInfo = liftIO $ callocBytes 56 >>= wrapPtr RecentFilterInfo
+newZeroRecentFilterInfo = liftIO $ wrappedPtrCalloc >>= wrapPtr RecentFilterInfo
 
 instance tag ~ 'AttrSet => Constructible RecentFilterInfo tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/RecentFilterInfo.hs-boot b/GI/Gtk/Structs/RecentFilterInfo.hs-boot
--- a/GI/Gtk/Structs/RecentFilterInfo.hs-boot
+++ b/GI/Gtk/Structs/RecentFilterInfo.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype RecentFilterInfo = RecentFilterInfo (ForeignPtr RecentFilterInfo)
+instance WrappedPtr RecentFilterInfo where
diff --git a/GI/Gtk/Structs/RequestedSize.hs b/GI/Gtk/Structs/RequestedSize.hs
--- a/GI/Gtk/Structs/RequestedSize.hs
+++ b/GI/Gtk/Structs/RequestedSize.hs
@@ -54,9 +54,14 @@
 import GI.Gtk.Callbacks
 
 newtype RequestedSize = RequestedSize (ForeignPtr RequestedSize)
+instance WrappedPtr RequestedSize where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `RequestedSize` struct initialized to zero.
 newZeroRequestedSize :: MonadIO m => m RequestedSize
-newZeroRequestedSize = liftIO $ callocBytes 16 >>= wrapPtr RequestedSize
+newZeroRequestedSize = liftIO $ wrappedPtrCalloc >>= wrapPtr RequestedSize
 
 instance tag ~ 'AttrSet => Constructible RequestedSize tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/RequestedSize.hs-boot b/GI/Gtk/Structs/RequestedSize.hs-boot
--- a/GI/Gtk/Structs/RequestedSize.hs-boot
+++ b/GI/Gtk/Structs/RequestedSize.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype RequestedSize = RequestedSize (ForeignPtr RequestedSize)
+instance WrappedPtr RequestedSize where
diff --git a/GI/Gtk/Structs/SelectionData.hs b/GI/Gtk/Structs/SelectionData.hs
--- a/GI/Gtk/Structs/SelectionData.hs
+++ b/GI/Gtk/Structs/SelectionData.hs
@@ -227,8 +227,7 @@
     let _obj' = unsafeManagedPtrGetPtr _obj
     result <- gtk_selection_data_get_data_type _obj'
     checkUnexpectedReturnNULL "gtk_selection_data_get_data_type" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Gdk.Atom) result
     touchManagedPtr _obj
     return result'
 
@@ -403,8 +402,7 @@
     let _obj' = unsafeManagedPtrGetPtr _obj
     result <- gtk_selection_data_get_selection _obj'
     checkUnexpectedReturnNULL "gtk_selection_data_get_selection" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Gdk.Atom) result
     touchManagedPtr _obj
     return result'
 
@@ -433,8 +431,7 @@
     let _obj' = unsafeManagedPtrGetPtr _obj
     result <- gtk_selection_data_get_target _obj'
     checkUnexpectedReturnNULL "gtk_selection_data_get_target" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Gdk.Atom) result
     touchManagedPtr _obj
     return result'
 
@@ -469,9 +466,8 @@
     nAtoms' <- peek nAtoms
     let result' = (/= 0) result
     targets' <- peek targets
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
     targets'' <- (unpackPtrArrayWithLength nAtoms') targets'
-    targets''' <- mapM (\x -> Gdk.Atom <$> newForeignPtr_ x) targets''
+    targets''' <- mapM (newPtr Gdk.Atom) targets''
     freeMem targets'
     touchManagedPtr _obj
     freeMem targets
diff --git a/GI/Gtk/Structs/SettingsValue.hs b/GI/Gtk/Structs/SettingsValue.hs
--- a/GI/Gtk/Structs/SettingsValue.hs
+++ b/GI/Gtk/Structs/SettingsValue.hs
@@ -45,9 +45,14 @@
 import GI.Gtk.Callbacks
 
 newtype SettingsValue = SettingsValue (ForeignPtr SettingsValue)
+instance WrappedPtr SettingsValue where
+    wrappedPtrCalloc = callocBytes 32
+    wrappedPtrCopy = copyPtr 32
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `SettingsValue` struct initialized to zero.
 newZeroSettingsValue :: MonadIO m => m SettingsValue
-newZeroSettingsValue = liftIO $ callocBytes 32 >>= wrapPtr SettingsValue
+newZeroSettingsValue = liftIO $ wrappedPtrCalloc >>= wrapPtr SettingsValue
 
 instance tag ~ 'AttrSet => Constructible SettingsValue tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/SettingsValue.hs-boot b/GI/Gtk/Structs/SettingsValue.hs-boot
--- a/GI/Gtk/Structs/SettingsValue.hs-boot
+++ b/GI/Gtk/Structs/SettingsValue.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype SettingsValue = SettingsValue (ForeignPtr SettingsValue)
+instance WrappedPtr SettingsValue where
diff --git a/GI/Gtk/Structs/StockItem.hs b/GI/Gtk/Structs/StockItem.hs
--- a/GI/Gtk/Structs/StockItem.hs
+++ b/GI/Gtk/Structs/StockItem.hs
@@ -73,9 +73,14 @@
 import qualified GI.Gdk as Gdk
 
 newtype StockItem = StockItem (ForeignPtr StockItem)
+instance WrappedPtr StockItem where
+    wrappedPtrCalloc = callocBytes 32
+    wrappedPtrCopy = copyPtr 32
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `StockItem` struct initialized to zero.
 newZeroStockItem :: MonadIO m => m StockItem
-newZeroStockItem = liftIO $ callocBytes 32 >>= wrapPtr StockItem
+newZeroStockItem = liftIO $ wrappedPtrCalloc >>= wrapPtr StockItem
 
 instance tag ~ 'AttrSet => Constructible StockItem tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/StockItem.hs-boot b/GI/Gtk/Structs/StockItem.hs-boot
--- a/GI/Gtk/Structs/StockItem.hs-boot
+++ b/GI/Gtk/Structs/StockItem.hs-boot
@@ -8,4 +8,5 @@
 import qualified Data.Map as Map
 
 newtype StockItem = StockItem (ForeignPtr StockItem)
+instance WrappedPtr StockItem where
 data StockItemFreeMethodInfo
diff --git a/GI/Gtk/Structs/TableChild.hs b/GI/Gtk/Structs/TableChild.hs
--- a/GI/Gtk/Structs/TableChild.hs
+++ b/GI/Gtk/Structs/TableChild.hs
@@ -110,9 +110,14 @@
 import GI.Gtk.Callbacks
 
 newtype TableChild = TableChild (ForeignPtr TableChild)
+instance WrappedPtr TableChild where
+    wrappedPtrCalloc = callocBytes 48
+    wrappedPtrCopy = copyPtr 48
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TableChild` struct initialized to zero.
 newZeroTableChild :: MonadIO m => m TableChild
-newZeroTableChild = liftIO $ callocBytes 48 >>= wrapPtr TableChild
+newZeroTableChild = liftIO $ wrappedPtrCalloc >>= wrapPtr TableChild
 
 instance tag ~ 'AttrSet => Constructible TableChild tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/TableChild.hs-boot b/GI/Gtk/Structs/TableChild.hs-boot
--- a/GI/Gtk/Structs/TableChild.hs-boot
+++ b/GI/Gtk/Structs/TableChild.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TableChild = TableChild (ForeignPtr TableChild)
+instance WrappedPtr TableChild where
diff --git a/GI/Gtk/Structs/TableRowCol.hs b/GI/Gtk/Structs/TableRowCol.hs
--- a/GI/Gtk/Structs/TableRowCol.hs
+++ b/GI/Gtk/Structs/TableRowCol.hs
@@ -79,9 +79,14 @@
 import GI.Gtk.Callbacks
 
 newtype TableRowCol = TableRowCol (ForeignPtr TableRowCol)
+instance WrappedPtr TableRowCol where
+    wrappedPtrCalloc = callocBytes 28
+    wrappedPtrCopy = copyPtr 28
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TableRowCol` struct initialized to zero.
 newZeroTableRowCol :: MonadIO m => m TableRowCol
-newZeroTableRowCol = liftIO $ callocBytes 28 >>= wrapPtr TableRowCol
+newZeroTableRowCol = liftIO $ wrappedPtrCalloc >>= wrapPtr TableRowCol
 
 instance tag ~ 'AttrSet => Constructible TableRowCol tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/TableRowCol.hs-boot b/GI/Gtk/Structs/TableRowCol.hs-boot
--- a/GI/Gtk/Structs/TableRowCol.hs-boot
+++ b/GI/Gtk/Structs/TableRowCol.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TableRowCol = TableRowCol (ForeignPtr TableRowCol)
+instance WrappedPtr TableRowCol where
diff --git a/GI/Gtk/Structs/TargetPair.hs b/GI/Gtk/Structs/TargetPair.hs
--- a/GI/Gtk/Structs/TargetPair.hs
+++ b/GI/Gtk/Structs/TargetPair.hs
@@ -55,9 +55,14 @@
 import qualified GI.Gdk as Gdk
 
 newtype TargetPair = TargetPair (ForeignPtr TargetPair)
+instance WrappedPtr TargetPair where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TargetPair` struct initialized to zero.
 newZeroTargetPair :: MonadIO m => m TargetPair
-newZeroTargetPair = liftIO $ callocBytes 16 >>= wrapPtr TargetPair
+newZeroTargetPair = liftIO $ wrappedPtrCalloc >>= wrapPtr TargetPair
 
 instance tag ~ 'AttrSet => Constructible TargetPair tag where
     new _ attrs = do
@@ -73,8 +78,7 @@
 targetPairReadTarget s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr Gdk.Atom)
     result <- convertIfNonNull val $ \val' -> do
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        val'' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) val'
+        val'' <- (newPtr Gdk.Atom) val'
         return val''
     return result
 
diff --git a/GI/Gtk/Structs/TargetPair.hs-boot b/GI/Gtk/Structs/TargetPair.hs-boot
--- a/GI/Gtk/Structs/TargetPair.hs-boot
+++ b/GI/Gtk/Structs/TargetPair.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TargetPair = TargetPair (ForeignPtr TargetPair)
+instance WrappedPtr TargetPair where
diff --git a/GI/Gtk/Structs/TextAppearance.hs b/GI/Gtk/Structs/TextAppearance.hs
--- a/GI/Gtk/Structs/TextAppearance.hs
+++ b/GI/Gtk/Structs/TextAppearance.hs
@@ -82,9 +82,14 @@
 import qualified GI.Gdk as Gdk
 
 newtype TextAppearance = TextAppearance (ForeignPtr TextAppearance)
+instance WrappedPtr TextAppearance where
+    wrappedPtrCalloc = callocBytes 48
+    wrappedPtrCopy = copyPtr 48
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TextAppearance` struct initialized to zero.
 newZeroTextAppearance :: MonadIO m => m TextAppearance
-newZeroTextAppearance = liftIO $ callocBytes 48 >>= wrapPtr TextAppearance
+newZeroTextAppearance = liftIO $ wrappedPtrCalloc >>= wrapPtr TextAppearance
 
 instance tag ~ 'AttrSet => Constructible TextAppearance tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/TextAppearance.hs-boot b/GI/Gtk/Structs/TextAppearance.hs-boot
--- a/GI/Gtk/Structs/TextAppearance.hs-boot
+++ b/GI/Gtk/Structs/TextAppearance.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TextAppearance = TextAppearance (ForeignPtr TextAppearance)
+instance WrappedPtr TextAppearance where
diff --git a/GI/Gtk/Structs/TextAttributes.hs b/GI/Gtk/Structs/TextAttributes.hs
--- a/GI/Gtk/Structs/TextAttributes.hs
+++ b/GI/Gtk/Structs/TextAttributes.hs
@@ -206,7 +206,7 @@
 textAttributesReadAppearance s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 4) :: IO (Ptr TextAppearance)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 48 TextAppearance) val'
+        val'' <- (newPtr TextAppearance) val'
         return val''
     return result
 
diff --git a/GI/Gtk/Structs/TextBTree.hs b/GI/Gtk/Structs/TextBTree.hs
--- a/GI/Gtk/Structs/TextBTree.hs
+++ b/GI/Gtk/Structs/TextBTree.hs
@@ -27,6 +27,12 @@
 import GI.Gtk.Callbacks
 
 newtype TextBTree = TextBTree (ForeignPtr TextBTree)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr TextBTree where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noTextBTree :: Maybe TextBTree
 noTextBTree = Nothing
 
diff --git a/GI/Gtk/Structs/TextBTree.hs-boot b/GI/Gtk/Structs/TextBTree.hs-boot
--- a/GI/Gtk/Structs/TextBTree.hs-boot
+++ b/GI/Gtk/Structs/TextBTree.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TextBTree = TextBTree (ForeignPtr TextBTree)
+instance WrappedPtr TextBTree where
diff --git a/GI/Gtk/Structs/ThemeEngine.hs b/GI/Gtk/Structs/ThemeEngine.hs
--- a/GI/Gtk/Structs/ThemeEngine.hs
+++ b/GI/Gtk/Structs/ThemeEngine.hs
@@ -27,6 +27,12 @@
 import GI.Gtk.Callbacks
 
 newtype ThemeEngine = ThemeEngine (ForeignPtr ThemeEngine)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr ThemeEngine where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noThemeEngine :: Maybe ThemeEngine
 noThemeEngine = Nothing
 
diff --git a/GI/Gtk/Structs/ThemeEngine.hs-boot b/GI/Gtk/Structs/ThemeEngine.hs-boot
--- a/GI/Gtk/Structs/ThemeEngine.hs-boot
+++ b/GI/Gtk/Structs/ThemeEngine.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype ThemeEngine = ThemeEngine (ForeignPtr ThemeEngine)
+instance WrappedPtr ThemeEngine where
diff --git a/GI/Gtk/Structs/ToggleActionEntry.hs b/GI/Gtk/Structs/ToggleActionEntry.hs
--- a/GI/Gtk/Structs/ToggleActionEntry.hs
+++ b/GI/Gtk/Structs/ToggleActionEntry.hs
@@ -75,9 +75,14 @@
 import GI.Gtk.Callbacks
 
 newtype ToggleActionEntry = ToggleActionEntry (ForeignPtr ToggleActionEntry)
+instance WrappedPtr ToggleActionEntry where
+    wrappedPtrCalloc = callocBytes 56
+    wrappedPtrCopy = copyPtr 56
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `ToggleActionEntry` struct initialized to zero.
 newZeroToggleActionEntry :: MonadIO m => m ToggleActionEntry
-newZeroToggleActionEntry = liftIO $ callocBytes 56 >>= wrapPtr ToggleActionEntry
+newZeroToggleActionEntry = liftIO $ wrappedPtrCalloc >>= wrapPtr ToggleActionEntry
 
 instance tag ~ 'AttrSet => Constructible ToggleActionEntry tag where
     new _ attrs = do
diff --git a/GI/Gtk/Structs/ToggleActionEntry.hs-boot b/GI/Gtk/Structs/ToggleActionEntry.hs-boot
--- a/GI/Gtk/Structs/ToggleActionEntry.hs-boot
+++ b/GI/Gtk/Structs/ToggleActionEntry.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype ToggleActionEntry = ToggleActionEntry (ForeignPtr ToggleActionEntry)
+instance WrappedPtr ToggleActionEntry where
diff --git a/GI/Gtk/Structs/WindowGeometryInfo.hs b/GI/Gtk/Structs/WindowGeometryInfo.hs
--- a/GI/Gtk/Structs/WindowGeometryInfo.hs
+++ b/GI/Gtk/Structs/WindowGeometryInfo.hs
@@ -27,6 +27,12 @@
 import GI.Gtk.Callbacks
 
 newtype WindowGeometryInfo = WindowGeometryInfo (ForeignPtr WindowGeometryInfo)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr WindowGeometryInfo where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noWindowGeometryInfo :: Maybe WindowGeometryInfo
 noWindowGeometryInfo = Nothing
 
diff --git a/GI/Gtk/Structs/WindowGeometryInfo.hs-boot b/GI/Gtk/Structs/WindowGeometryInfo.hs-boot
--- a/GI/Gtk/Structs/WindowGeometryInfo.hs-boot
+++ b/GI/Gtk/Structs/WindowGeometryInfo.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype WindowGeometryInfo = WindowGeometryInfo (ForeignPtr WindowGeometryInfo)
+instance WrappedPtr WindowGeometryInfo where
diff --git a/gi-gtk.cabal b/gi-gtk.cabal
--- a/gi-gtk.cabal
+++ b/gi-gtk.cabal
@@ -1,6 +1,6 @@
 -- Autogenerated, do not edit.
 name:               gi-gtk
-version:            0.3.18.14
+version:            0.3.18.15
 synopsis:           Gtk bindings
 description:        Bindings for Gtk, autogenerated by haskell-gi.
 homepage:           https://github.com/haskell-gi/haskell-gi
@@ -351,15 +351,15 @@
                         GI.Gtk.Structs.WindowGeometryInfo
     pkgconfig-depends:  gtk+-3.0 >= 3.18
     build-depends: base >= 4.7 && <5,
-        haskell-gi-base >= 0.14 && < 1,
-        gi-atk >= 0.2.18.14 && < 0.2.19,
-        gi-glib >= 0.2.46.14 && < 0.2.47,
-        gi-gobject >= 0.2.46.14 && < 0.2.47,
-        gi-gdk >= 0.3.18.14 && < 0.3.19,
-        gi-gdkpixbuf >= 0.2.32.14 && < 0.2.33,
-        gi-gio >= 0.2.46.14 && < 0.2.47,
-        gi-pango >= 0.1.38.14 && < 0.1.39,
-        gi-cairo >= 0.1.14.14 && < 0.1.15,
+        haskell-gi-base >= 0.15 && < 1,
+        gi-atk >= 0.2.18.15 && < 0.2.19,
+        gi-glib >= 0.2.46.15 && < 0.2.47,
+        gi-gobject >= 0.2.46.15 && < 0.2.47,
+        gi-gdk >= 0.3.18.15 && < 0.3.19,
+        gi-gdkpixbuf >= 0.2.32.15 && < 0.2.33,
+        gi-gio >= 0.2.46.15 && < 0.2.47,
+        gi-pango >= 0.1.38.15 && < 0.1.39,
+        gi-cairo >= 0.1.14.15 && < 0.1.15,
         bytestring >= 0.10,
         containers >= 0.5,
         text >= 1.0,
