diff --git a/GI/GLib/Callbacks.hs b/GI/GLib/Callbacks.hs
--- a/GI/GLib/Callbacks.hs
+++ b/GI/GLib/Callbacks.hs
@@ -1080,10 +1080,8 @@
     Ptr () ->
     IO Int32
 sequenceIterCompareFuncWrapper funptrptr _cb a b data_ = do
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    a' <- (\x -> SequenceIter <$> newForeignPtr_ x) a
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    b' <- (\x -> SequenceIter <$> newForeignPtr_ x) b
+    a' <- (newPtr SequenceIter) a
+    b' <- (newPtr SequenceIter) b
     result <- _cb  a' b' data_
     maybeReleaseFunPtr funptrptr
     return result
@@ -1119,7 +1117,7 @@
     CInt ->
     IO ()
 scannerMsgFuncWrapper funptrptr _cb scanner message error_ = do
-    scanner' <- (newPtr 144 Scanner) scanner
+    scanner' <- (newPtr Scanner) scanner
     message' <- cstringToText message
     let error_' = (/= 0) error_
     _cb  scanner' message' error_'
@@ -1258,8 +1256,7 @@
     Ptr () ->
     IO CInt
 optionParseFuncWrapper funptrptr _cb context group data_ = do
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    context' <- (\x -> OptionContext <$> newForeignPtr_ x) context
+    context' <- (newPtr OptionContext) context
     group' <- (newBoxed OptionGroup) group
     result <- _cb  context' group' data_
     maybeReleaseFunPtr funptrptr
@@ -1297,8 +1294,7 @@
     Ptr () ->
     IO ()
 optionErrorFuncWrapper funptrptr _cb context group data_ = do
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    context' <- (\x -> OptionContext <$> newForeignPtr_ x) context
+    context' <- (newPtr OptionContext) context
     group' <- (newBoxed OptionGroup) group
     _cb  context' group' data_
     maybeReleaseFunPtr funptrptr
@@ -1369,7 +1365,7 @@
     Ptr () ->
     IO CInt
 nodeTraverseFuncWrapper funptrptr _cb node data_ = do
-    node' <- (newPtr 40 Node) node
+    node' <- (newPtr Node) node
     result <- _cb  node' data_
     maybeReleaseFunPtr funptrptr
     let result' = (fromIntegral . fromEnum) result
@@ -1403,7 +1399,7 @@
     Ptr () ->
     IO ()
 nodeForeachFuncWrapper funptrptr _cb node data_ = do
-    node' <- (newPtr 40 Node) node
+    node' <- (newPtr Node) node
     _cb  node' data_
     maybeReleaseFunPtr funptrptr
 
@@ -2010,7 +2006,7 @@
     Ptr () ->
     IO ()
 hookMarshallerWrapper funptrptr _cb hook marshalData = do
-    hook' <- (newPtr 64 Hook) hook
+    hook' <- (newPtr Hook) hook
     _cb  hook' marshalData
     maybeReleaseFunPtr funptrptr
 
@@ -2070,7 +2066,7 @@
     Ptr () ->
     IO CInt
 hookFindFuncWrapper funptrptr _cb hook data_ = do
-    hook' <- (newPtr 64 Hook) hook
+    hook' <- (newPtr Hook) hook
     result <- _cb  hook' data_
     maybeReleaseFunPtr funptrptr
     let result' = (fromIntegral . fromEnum) result
@@ -2104,8 +2100,8 @@
     Ptr Hook ->
     IO ()
 hookFinalizeFuncWrapper funptrptr _cb hookList hook = do
-    hookList' <- (newPtr 56 HookList) hookList
-    hook' <- (newPtr 64 Hook) hook
+    hookList' <- (newPtr HookList) hookList
+    hook' <- (newPtr Hook) hook
     _cb  hookList' hook'
     maybeReleaseFunPtr funptrptr
 
@@ -2137,8 +2133,8 @@
     Ptr Hook ->
     IO Int32
 hookCompareFuncWrapper funptrptr _cb newHook sibling = do
-    newHook' <- (newPtr 64 Hook) newHook
-    sibling' <- (newPtr 64 Hook) sibling
+    newHook' <- (newPtr Hook) newHook
+    sibling' <- (newPtr Hook) sibling
     result <- _cb  newHook' sibling'
     maybeReleaseFunPtr funptrptr
     return result
@@ -2171,7 +2167,7 @@
     Ptr () ->
     IO CInt
 hookCheckMarshallerWrapper funptrptr _cb hook marshalData = do
-    hook' <- (newPtr 64 Hook) hook
+    hook' <- (newPtr Hook) hook
     result <- _cb  hook' marshalData
     maybeReleaseFunPtr funptrptr
     let result' = (fromIntegral . fromEnum) result
diff --git a/GI/GLib/Structs/AsyncQueue.hs b/GI/GLib/Structs/AsyncQueue.hs
--- a/GI/GLib/Structs/AsyncQueue.hs
+++ b/GI/GLib/Structs/AsyncQueue.hs
@@ -99,6 +99,12 @@
 import GI.GLib.Callbacks
 
 newtype AsyncQueue = AsyncQueue (ForeignPtr AsyncQueue)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr AsyncQueue where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noAsyncQueue :: Maybe AsyncQueue
 noAsyncQueue = Nothing
 
diff --git a/GI/GLib/Structs/AsyncQueue.hs-boot b/GI/GLib/Structs/AsyncQueue.hs-boot
--- a/GI/GLib/Structs/AsyncQueue.hs-boot
+++ b/GI/GLib/Structs/AsyncQueue.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype AsyncQueue = AsyncQueue (ForeignPtr AsyncQueue)
+instance WrappedPtr AsyncQueue where
 data AsyncQueueLengthMethodInfo
 data AsyncQueueLengthUnlockedMethodInfo
 data AsyncQueueLockMethodInfo
diff --git a/GI/GLib/Structs/BookmarkFile.hs b/GI/GLib/Structs/BookmarkFile.hs
--- a/GI/GLib/Structs/BookmarkFile.hs
+++ b/GI/GLib/Structs/BookmarkFile.hs
@@ -227,6 +227,12 @@
 import GI.GLib.Callbacks
 
 newtype BookmarkFile = BookmarkFile (ForeignPtr BookmarkFile)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr BookmarkFile where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noBookmarkFile :: Maybe BookmarkFile
 noBookmarkFile = Nothing
 
diff --git a/GI/GLib/Structs/BookmarkFile.hs-boot b/GI/GLib/Structs/BookmarkFile.hs-boot
--- a/GI/GLib/Structs/BookmarkFile.hs-boot
+++ b/GI/GLib/Structs/BookmarkFile.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype BookmarkFile = BookmarkFile (ForeignPtr BookmarkFile)
+instance WrappedPtr BookmarkFile where
 data BookmarkFileAddApplicationMethodInfo
 data BookmarkFileAddGroupMethodInfo
 data BookmarkFileFreeMethodInfo
diff --git a/GI/GLib/Structs/Cond.hs b/GI/GLib/Structs/Cond.hs
--- a/GI/GLib/Structs/Cond.hs
+++ b/GI/GLib/Structs/Cond.hs
@@ -127,9 +127,14 @@
 import GI.GLib.Callbacks
 
 newtype Cond = Cond (ForeignPtr Cond)
+instance WrappedPtr Cond where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Cond` struct initialized to zero.
 newZeroCond :: MonadIO m => m Cond
-newZeroCond = liftIO $ callocBytes 16 >>= wrapPtr Cond
+newZeroCond = liftIO $ wrappedPtrCalloc >>= wrapPtr Cond
 
 instance tag ~ 'AttrSet => Constructible Cond tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/Cond.hs-boot b/GI/GLib/Structs/Cond.hs-boot
--- a/GI/GLib/Structs/Cond.hs-boot
+++ b/GI/GLib/Structs/Cond.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Cond = Cond (ForeignPtr Cond)
+instance WrappedPtr Cond where
 data CondBroadcastMethodInfo
 data CondClearMethodInfo
 data CondInitMethodInfo
diff --git a/GI/GLib/Structs/Data.hs b/GI/GLib/Structs/Data.hs
--- a/GI/GLib/Structs/Data.hs
+++ b/GI/GLib/Structs/Data.hs
@@ -31,6 +31,12 @@
 import GI.GLib.Callbacks
 
 newtype Data = Data (ForeignPtr Data)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr Data where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noData :: Maybe Data
 noData = Nothing
 
diff --git a/GI/GLib/Structs/Data.hs-boot b/GI/GLib/Structs/Data.hs-boot
--- a/GI/GLib/Structs/Data.hs-boot
+++ b/GI/GLib/Structs/Data.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype Data = Data (ForeignPtr Data)
+instance WrappedPtr Data where
diff --git a/GI/GLib/Structs/DebugKey.hs b/GI/GLib/Structs/DebugKey.hs
--- a/GI/GLib/Structs/DebugKey.hs
+++ b/GI/GLib/Structs/DebugKey.hs
@@ -47,9 +47,14 @@
 import GI.GLib.Callbacks
 
 newtype DebugKey = DebugKey (ForeignPtr DebugKey)
+instance WrappedPtr DebugKey where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `DebugKey` struct initialized to zero.
 newZeroDebugKey :: MonadIO m => m DebugKey
-newZeroDebugKey = liftIO $ callocBytes 16 >>= wrapPtr DebugKey
+newZeroDebugKey = liftIO $ wrappedPtrCalloc >>= wrapPtr DebugKey
 
 instance tag ~ 'AttrSet => Constructible DebugKey tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/DebugKey.hs-boot b/GI/GLib/Structs/DebugKey.hs-boot
--- a/GI/GLib/Structs/DebugKey.hs-boot
+++ b/GI/GLib/Structs/DebugKey.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype DebugKey = DebugKey (ForeignPtr DebugKey)
+instance WrappedPtr DebugKey where
diff --git a/GI/GLib/Structs/Dir.hs b/GI/GLib/Structs/Dir.hs
--- a/GI/GLib/Structs/Dir.hs
+++ b/GI/GLib/Structs/Dir.hs
@@ -51,6 +51,12 @@
 import GI.GLib.Callbacks
 
 newtype Dir = Dir (ForeignPtr Dir)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr Dir where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noDir :: Maybe Dir
 noDir = Nothing
 
diff --git a/GI/GLib/Structs/Dir.hs-boot b/GI/GLib/Structs/Dir.hs-boot
--- a/GI/GLib/Structs/Dir.hs-boot
+++ b/GI/GLib/Structs/Dir.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Dir = Dir (ForeignPtr Dir)
+instance WrappedPtr Dir where
 data DirCloseMethodInfo
 data DirReadNameMethodInfo
 data DirRewindMethodInfo
diff --git a/GI/GLib/Structs/HashTableIter.hs b/GI/GLib/Structs/HashTableIter.hs
--- a/GI/GLib/Structs/HashTableIter.hs
+++ b/GI/GLib/Structs/HashTableIter.hs
@@ -61,9 +61,14 @@
 import GI.GLib.Callbacks
 
 newtype HashTableIter = HashTableIter (ForeignPtr HashTableIter)
+instance WrappedPtr HashTableIter where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `HashTableIter` struct initialized to zero.
 newZeroHashTableIter :: MonadIO m => m HashTableIter
-newZeroHashTableIter = liftIO $ callocBytes 40 >>= wrapPtr HashTableIter
+newZeroHashTableIter = liftIO $ wrappedPtrCalloc >>= wrapPtr HashTableIter
 
 instance tag ~ 'AttrSet => Constructible HashTableIter tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/HashTableIter.hs-boot b/GI/GLib/Structs/HashTableIter.hs-boot
--- a/GI/GLib/Structs/HashTableIter.hs-boot
+++ b/GI/GLib/Structs/HashTableIter.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype HashTableIter = HashTableIter (ForeignPtr HashTableIter)
+instance WrappedPtr HashTableIter where
 data HashTableIterInitMethodInfo
 data HashTableIterNextMethodInfo
 data HashTableIterRemoveMethodInfo
diff --git a/GI/GLib/Structs/Hmac.hs b/GI/GLib/Structs/Hmac.hs
--- a/GI/GLib/Structs/Hmac.hs
+++ b/GI/GLib/Structs/Hmac.hs
@@ -54,6 +54,12 @@
 import GI.GLib.Callbacks
 
 newtype Hmac = Hmac (ForeignPtr Hmac)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr Hmac where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noHmac :: Maybe Hmac
 noHmac = Nothing
 
diff --git a/GI/GLib/Structs/Hmac.hs-boot b/GI/GLib/Structs/Hmac.hs-boot
--- a/GI/GLib/Structs/Hmac.hs-boot
+++ b/GI/GLib/Structs/Hmac.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Hmac = Hmac (ForeignPtr Hmac)
+instance WrappedPtr Hmac where
 data HmacGetDigestMethodInfo
 data HmacGetStringMethodInfo
 data HmacUnrefMethodInfo
diff --git a/GI/GLib/Structs/Hook.hs b/GI/GLib/Structs/Hook.hs
--- a/GI/GLib/Structs/Hook.hs
+++ b/GI/GLib/Structs/Hook.hs
@@ -111,9 +111,14 @@
 import GI.GLib.Callbacks
 
 newtype Hook = Hook (ForeignPtr Hook)
+instance WrappedPtr Hook where
+    wrappedPtrCalloc = callocBytes 64
+    wrappedPtrCopy = copyPtr 64
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Hook` struct initialized to zero.
 newZeroHook :: MonadIO m => m Hook
-newZeroHook = liftIO $ callocBytes 64 >>= wrapPtr Hook
+newZeroHook = liftIO $ wrappedPtrCalloc >>= wrapPtr Hook
 
 instance tag ~ 'AttrSet => Constructible Hook tag where
     new _ attrs = do
@@ -158,7 +163,7 @@
 hookReadNext s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 8) :: IO (Ptr Hook)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 64 Hook) val'
+        val'' <- (newPtr Hook) val'
         return val''
     return result
 
@@ -190,7 +195,7 @@
 hookReadPrev s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 16) :: IO (Ptr Hook)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 64 Hook) val'
+        val'' <- (newPtr Hook) val'
         return val''
     return result
 
diff --git a/GI/GLib/Structs/Hook.hs-boot b/GI/GLib/Structs/Hook.hs-boot
--- a/GI/GLib/Structs/Hook.hs-boot
+++ b/GI/GLib/Structs/Hook.hs-boot
@@ -8,4 +8,5 @@
 import qualified Data.Map as Map
 
 newtype Hook = Hook (ForeignPtr Hook)
+instance WrappedPtr Hook where
 data HookCompareIdsMethodInfo
diff --git a/GI/GLib/Structs/HookList.hs b/GI/GLib/Structs/HookList.hs
--- a/GI/GLib/Structs/HookList.hs
+++ b/GI/GLib/Structs/HookList.hs
@@ -88,9 +88,14 @@
 import GI.GLib.Callbacks
 
 newtype HookList = HookList (ForeignPtr HookList)
+instance WrappedPtr HookList where
+    wrappedPtrCalloc = callocBytes 56
+    wrappedPtrCopy = copyPtr 56
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `HookList` struct initialized to zero.
 newZeroHookList :: MonadIO m => m HookList
-newZeroHookList = liftIO $ callocBytes 56 >>= wrapPtr HookList
+newZeroHookList = liftIO $ wrappedPtrCalloc >>= wrapPtr HookList
 
 instance tag ~ 'AttrSet => Constructible HookList tag where
     new _ attrs = do
@@ -181,7 +186,7 @@
 hookListReadHooks s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 16) :: IO (Ptr Hook)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 64 Hook) val'
+        val'' <- (newPtr Hook) val'
         return val''
     return result
 
diff --git a/GI/GLib/Structs/HookList.hs-boot b/GI/GLib/Structs/HookList.hs-boot
--- a/GI/GLib/Structs/HookList.hs-boot
+++ b/GI/GLib/Structs/HookList.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype HookList = HookList (ForeignPtr HookList)
+instance WrappedPtr HookList where
 data HookListClearMethodInfo
 data HookListInitMethodInfo
 data HookListInvokeMethodInfo
diff --git a/GI/GLib/Structs/IConv.hs b/GI/GLib/Structs/IConv.hs
--- a/GI/GLib/Structs/IConv.hs
+++ b/GI/GLib/Structs/IConv.hs
@@ -38,6 +38,12 @@
 import GI.GLib.Callbacks
 
 newtype IConv = IConv (ForeignPtr IConv)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr IConv where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noIConv :: Maybe IConv
 noIConv = Nothing
 
diff --git a/GI/GLib/Structs/IConv.hs-boot b/GI/GLib/Structs/IConv.hs-boot
--- a/GI/GLib/Structs/IConv.hs-boot
+++ b/GI/GLib/Structs/IConv.hs-boot
@@ -8,4 +8,5 @@
 import qualified Data.Map as Map
 
 newtype IConv = IConv (ForeignPtr IConv)
+instance WrappedPtr IConv where
 data IConvCloseMethodInfo
diff --git a/GI/GLib/Structs/IOFuncs.hs b/GI/GLib/Structs/IOFuncs.hs
--- a/GI/GLib/Structs/IOFuncs.hs
+++ b/GI/GLib/Structs/IOFuncs.hs
@@ -31,9 +31,14 @@
 import GI.GLib.Callbacks
 
 newtype IOFuncs = IOFuncs (ForeignPtr IOFuncs)
+instance WrappedPtr IOFuncs where
+    wrappedPtrCalloc = callocBytes 64
+    wrappedPtrCopy = copyPtr 64
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `IOFuncs` struct initialized to zero.
 newZeroIOFuncs :: MonadIO m => m IOFuncs
-newZeroIOFuncs = liftIO $ callocBytes 64 >>= wrapPtr IOFuncs
+newZeroIOFuncs = liftIO $ wrappedPtrCalloc >>= wrapPtr IOFuncs
 
 instance tag ~ 'AttrSet => Constructible IOFuncs tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/IOFuncs.hs-boot b/GI/GLib/Structs/IOFuncs.hs-boot
--- a/GI/GLib/Structs/IOFuncs.hs-boot
+++ b/GI/GLib/Structs/IOFuncs.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype IOFuncs = IOFuncs (ForeignPtr IOFuncs)
+instance WrappedPtr IOFuncs where
diff --git a/GI/GLib/Structs/MarkupParser.hs b/GI/GLib/Structs/MarkupParser.hs
--- a/GI/GLib/Structs/MarkupParser.hs
+++ b/GI/GLib/Structs/MarkupParser.hs
@@ -36,9 +36,14 @@
 import GI.GLib.Callbacks
 
 newtype MarkupParser = MarkupParser (ForeignPtr MarkupParser)
+instance WrappedPtr MarkupParser where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `MarkupParser` struct initialized to zero.
 newZeroMarkupParser :: MonadIO m => m MarkupParser
-newZeroMarkupParser = liftIO $ callocBytes 40 >>= wrapPtr MarkupParser
+newZeroMarkupParser = liftIO $ wrappedPtrCalloc >>= wrapPtr MarkupParser
 
 instance tag ~ 'AttrSet => Constructible MarkupParser tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/MarkupParser.hs-boot b/GI/GLib/Structs/MarkupParser.hs-boot
--- a/GI/GLib/Structs/MarkupParser.hs-boot
+++ b/GI/GLib/Structs/MarkupParser.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype MarkupParser = MarkupParser (ForeignPtr MarkupParser)
+instance WrappedPtr MarkupParser where
diff --git a/GI/GLib/Structs/MemVTable.hs b/GI/GLib/Structs/MemVTable.hs
--- a/GI/GLib/Structs/MemVTable.hs
+++ b/GI/GLib/Structs/MemVTable.hs
@@ -34,9 +34,14 @@
 import GI.GLib.Callbacks
 
 newtype MemVTable = MemVTable (ForeignPtr MemVTable)
+instance WrappedPtr MemVTable where
+    wrappedPtrCalloc = callocBytes 48
+    wrappedPtrCopy = copyPtr 48
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `MemVTable` struct initialized to zero.
 newZeroMemVTable :: MonadIO m => m MemVTable
-newZeroMemVTable = liftIO $ callocBytes 48 >>= wrapPtr MemVTable
+newZeroMemVTable = liftIO $ wrappedPtrCalloc >>= wrapPtr MemVTable
 
 instance tag ~ 'AttrSet => Constructible MemVTable tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/MemVTable.hs-boot b/GI/GLib/Structs/MemVTable.hs-boot
--- a/GI/GLib/Structs/MemVTable.hs-boot
+++ b/GI/GLib/Structs/MemVTable.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype MemVTable = MemVTable (ForeignPtr MemVTable)
+instance WrappedPtr MemVTable where
diff --git a/GI/GLib/Structs/Node.hs b/GI/GLib/Structs/Node.hs
--- a/GI/GLib/Structs/Node.hs
+++ b/GI/GLib/Structs/Node.hs
@@ -121,9 +121,14 @@
 import GI.GLib.Callbacks
 
 newtype Node = Node (ForeignPtr Node)
+instance WrappedPtr Node where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Node` struct initialized to zero.
 newZeroNode :: MonadIO m => m Node
-newZeroNode = liftIO $ callocBytes 40 >>= wrapPtr Node
+newZeroNode = liftIO $ wrappedPtrCalloc >>= wrapPtr Node
 
 instance tag ~ 'AttrSet => Constructible Node tag where
     new _ attrs = do
@@ -168,7 +173,7 @@
 nodeReadNext s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 8) :: IO (Ptr Node)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 40 Node) val'
+        val'' <- (newPtr Node) val'
         return val''
     return result
 
@@ -200,7 +205,7 @@
 nodeReadPrev s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 16) :: IO (Ptr Node)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 40 Node) val'
+        val'' <- (newPtr Node) val'
         return val''
     return result
 
@@ -232,7 +237,7 @@
 nodeReadParent s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 24) :: IO (Ptr Node)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 40 Node) val'
+        val'' <- (newPtr Node) val'
         return val''
     return result
 
@@ -264,7 +269,7 @@
 nodeReadChildren s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 32) :: IO (Ptr Node)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 40 Node) val'
+        val'' <- (newPtr Node) val'
         return val''
     return result
 
diff --git a/GI/GLib/Structs/Node.hs-boot b/GI/GLib/Structs/Node.hs-boot
--- a/GI/GLib/Structs/Node.hs-boot
+++ b/GI/GLib/Structs/Node.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Node = Node (ForeignPtr Node)
+instance WrappedPtr Node where
 data NodeChildIndexMethodInfo
 data NodeChildPositionMethodInfo
 data NodeDepthMethodInfo
diff --git a/GI/GLib/Structs/Once.hs b/GI/GLib/Structs/Once.hs
--- a/GI/GLib/Structs/Once.hs
+++ b/GI/GLib/Structs/Once.hs
@@ -59,9 +59,14 @@
 import GI.GLib.Callbacks
 
 newtype Once = Once (ForeignPtr Once)
+instance WrappedPtr Once where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Once` struct initialized to zero.
 newZeroOnce :: MonadIO m => m Once
-newZeroOnce = liftIO $ callocBytes 16 >>= wrapPtr Once
+newZeroOnce = liftIO $ wrappedPtrCalloc >>= wrapPtr Once
 
 instance tag ~ 'AttrSet => Constructible Once tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/Once.hs-boot b/GI/GLib/Structs/Once.hs-boot
--- a/GI/GLib/Structs/Once.hs-boot
+++ b/GI/GLib/Structs/Once.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype Once = Once (ForeignPtr Once)
+instance WrappedPtr Once where
diff --git a/GI/GLib/Structs/OptionContext.hs b/GI/GLib/Structs/OptionContext.hs
--- a/GI/GLib/Structs/OptionContext.hs
+++ b/GI/GLib/Structs/OptionContext.hs
@@ -134,6 +134,12 @@
 import GI.GLib.Callbacks
 
 newtype OptionContext = OptionContext (ForeignPtr OptionContext)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr OptionContext where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noOptionContext :: Maybe OptionContext
 noOptionContext = Nothing
 
diff --git a/GI/GLib/Structs/OptionContext.hs-boot b/GI/GLib/Structs/OptionContext.hs-boot
--- a/GI/GLib/Structs/OptionContext.hs-boot
+++ b/GI/GLib/Structs/OptionContext.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype OptionContext = OptionContext (ForeignPtr OptionContext)
+instance WrappedPtr OptionContext where
 data OptionContextAddGroupMethodInfo
 data OptionContextAddMainEntriesMethodInfo
 data OptionContextFreeMethodInfo
diff --git a/GI/GLib/Structs/OptionEntry.hs b/GI/GLib/Structs/OptionEntry.hs
--- a/GI/GLib/Structs/OptionEntry.hs
+++ b/GI/GLib/Structs/OptionEntry.hs
@@ -81,9 +81,14 @@
 import GI.GLib.Callbacks
 
 newtype OptionEntry = OptionEntry (ForeignPtr OptionEntry)
+instance WrappedPtr OptionEntry where
+    wrappedPtrCalloc = callocBytes 48
+    wrappedPtrCopy = copyPtr 48
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `OptionEntry` struct initialized to zero.
 newZeroOptionEntry :: MonadIO m => m OptionEntry
-newZeroOptionEntry = liftIO $ callocBytes 48 >>= wrapPtr OptionEntry
+newZeroOptionEntry = liftIO $ wrappedPtrCalloc >>= wrapPtr OptionEntry
 
 instance tag ~ 'AttrSet => Constructible OptionEntry tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/OptionEntry.hs-boot b/GI/GLib/Structs/OptionEntry.hs-boot
--- a/GI/GLib/Structs/OptionEntry.hs-boot
+++ b/GI/GLib/Structs/OptionEntry.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype OptionEntry = OptionEntry (ForeignPtr OptionEntry)
+instance WrappedPtr OptionEntry where
diff --git a/GI/GLib/Structs/PatternSpec.hs b/GI/GLib/Structs/PatternSpec.hs
--- a/GI/GLib/Structs/PatternSpec.hs
+++ b/GI/GLib/Structs/PatternSpec.hs
@@ -43,6 +43,12 @@
 import GI.GLib.Callbacks
 
 newtype PatternSpec = PatternSpec (ForeignPtr PatternSpec)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr PatternSpec where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noPatternSpec :: Maybe PatternSpec
 noPatternSpec = Nothing
 
diff --git a/GI/GLib/Structs/PatternSpec.hs-boot b/GI/GLib/Structs/PatternSpec.hs-boot
--- a/GI/GLib/Structs/PatternSpec.hs-boot
+++ b/GI/GLib/Structs/PatternSpec.hs-boot
@@ -8,5 +8,6 @@
 import qualified Data.Map as Map
 
 newtype PatternSpec = PatternSpec (ForeignPtr PatternSpec)
+instance WrappedPtr PatternSpec where
 data PatternSpecEqualMethodInfo
 data PatternSpecFreeMethodInfo
diff --git a/GI/GLib/Structs/Queue.hs b/GI/GLib/Structs/Queue.hs
--- a/GI/GLib/Structs/Queue.hs
+++ b/GI/GLib/Structs/Queue.hs
@@ -122,9 +122,14 @@
 import GI.GLib.Callbacks
 
 newtype Queue = Queue (ForeignPtr Queue)
+instance WrappedPtr Queue where
+    wrappedPtrCalloc = callocBytes 24
+    wrappedPtrCopy = copyPtr 24
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Queue` struct initialized to zero.
 newZeroQueue :: MonadIO m => m Queue
-newZeroQueue = liftIO $ callocBytes 24 >>= wrapPtr Queue
+newZeroQueue = liftIO $ wrappedPtrCalloc >>= wrapPtr Queue
 
 instance tag ~ 'AttrSet => Constructible Queue tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/Queue.hs-boot b/GI/GLib/Structs/Queue.hs-boot
--- a/GI/GLib/Structs/Queue.hs-boot
+++ b/GI/GLib/Structs/Queue.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Queue = Queue (ForeignPtr Queue)
+instance WrappedPtr Queue where
 data QueueClearMethodInfo
 data QueueFreeMethodInfo
 data QueueFreeFullMethodInfo
diff --git a/GI/GLib/Structs/RWLock.hs b/GI/GLib/Structs/RWLock.hs
--- a/GI/GLib/Structs/RWLock.hs
+++ b/GI/GLib/Structs/RWLock.hs
@@ -131,9 +131,14 @@
 import GI.GLib.Callbacks
 
 newtype RWLock = RWLock (ForeignPtr RWLock)
+instance WrappedPtr RWLock where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `RWLock` struct initialized to zero.
 newZeroRWLock :: MonadIO m => m RWLock
-newZeroRWLock = liftIO $ callocBytes 16 >>= wrapPtr RWLock
+newZeroRWLock = liftIO $ wrappedPtrCalloc >>= wrapPtr RWLock
 
 instance tag ~ 'AttrSet => Constructible RWLock tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/RWLock.hs-boot b/GI/GLib/Structs/RWLock.hs-boot
--- a/GI/GLib/Structs/RWLock.hs-boot
+++ b/GI/GLib/Structs/RWLock.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype RWLock = RWLock (ForeignPtr RWLock)
+instance WrappedPtr RWLock where
 data RWLockClearMethodInfo
 data RWLockInitMethodInfo
 data RWLockReaderLockMethodInfo
diff --git a/GI/GLib/Structs/Rand.hs b/GI/GLib/Structs/Rand.hs
--- a/GI/GLib/Structs/Rand.hs
+++ b/GI/GLib/Structs/Rand.hs
@@ -68,6 +68,12 @@
 import GI.GLib.Callbacks
 
 newtype Rand = Rand (ForeignPtr Rand)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr Rand where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noRand :: Maybe Rand
 noRand = Nothing
 
diff --git a/GI/GLib/Structs/Rand.hs-boot b/GI/GLib/Structs/Rand.hs-boot
--- a/GI/GLib/Structs/Rand.hs-boot
+++ b/GI/GLib/Structs/Rand.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Rand = Rand (ForeignPtr Rand)
+instance WrappedPtr Rand where
 data RandDoubleMethodInfo
 data RandDoubleRangeMethodInfo
 data RandFreeMethodInfo
diff --git a/GI/GLib/Structs/RecMutex.hs b/GI/GLib/Structs/RecMutex.hs
--- a/GI/GLib/Structs/RecMutex.hs
+++ b/GI/GLib/Structs/RecMutex.hs
@@ -69,9 +69,14 @@
 import GI.GLib.Callbacks
 
 newtype RecMutex = RecMutex (ForeignPtr RecMutex)
+instance WrappedPtr RecMutex where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `RecMutex` struct initialized to zero.
 newZeroRecMutex :: MonadIO m => m RecMutex
-newZeroRecMutex = liftIO $ callocBytes 16 >>= wrapPtr RecMutex
+newZeroRecMutex = liftIO $ wrappedPtrCalloc >>= wrapPtr RecMutex
 
 instance tag ~ 'AttrSet => Constructible RecMutex tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/RecMutex.hs-boot b/GI/GLib/Structs/RecMutex.hs-boot
--- a/GI/GLib/Structs/RecMutex.hs-boot
+++ b/GI/GLib/Structs/RecMutex.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype RecMutex = RecMutex (ForeignPtr RecMutex)
+instance WrappedPtr RecMutex where
 data RecMutexClearMethodInfo
 data RecMutexInitMethodInfo
 data RecMutexLockMethodInfo
diff --git a/GI/GLib/Structs/Scanner.hs b/GI/GLib/Structs/Scanner.hs
--- a/GI/GLib/Structs/Scanner.hs
+++ b/GI/GLib/Structs/Scanner.hs
@@ -209,9 +209,14 @@
 import GI.GLib.Callbacks
 
 newtype Scanner = Scanner (ForeignPtr Scanner)
+instance WrappedPtr Scanner where
+    wrappedPtrCalloc = callocBytes 144
+    wrappedPtrCopy = copyPtr 144
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Scanner` struct initialized to zero.
 newZeroScanner :: MonadIO m => m Scanner
-newZeroScanner = liftIO $ callocBytes 144 >>= wrapPtr Scanner
+newZeroScanner = liftIO $ wrappedPtrCalloc >>= wrapPtr Scanner
 
 instance tag ~ 'AttrSet => Constructible Scanner tag where
     new _ attrs = do
@@ -338,8 +343,7 @@
 scannerReadQdata s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 24) :: IO (Ptr Data)
     result <- convertIfNonNull val $ \val' -> do
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        val'' <- (\x -> Data <$> newForeignPtr_ x) val'
+        val'' <- (newPtr Data) val'
         return val''
     return result
 
@@ -371,7 +375,7 @@
 scannerReadConfig s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 32) :: IO (Ptr ScannerConfig)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 128 ScannerConfig) val'
+        val'' <- (newPtr ScannerConfig) val'
         return val''
     return result
 
@@ -430,7 +434,7 @@
 scannerReadValue s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 48) :: IO (Ptr TokenValue)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 8 TokenValue) val'
+        val'' <- (newPtr TokenValue) val'
         return val''
     return result
 
@@ -539,7 +543,7 @@
 scannerReadNextValue s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 72) :: IO (Ptr TokenValue)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 8 TokenValue) val'
+        val'' <- (newPtr TokenValue) val'
         return val''
     return result
 
diff --git a/GI/GLib/Structs/Scanner.hs-boot b/GI/GLib/Structs/Scanner.hs-boot
--- a/GI/GLib/Structs/Scanner.hs-boot
+++ b/GI/GLib/Structs/Scanner.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Scanner = Scanner (ForeignPtr Scanner)
+instance WrappedPtr Scanner where
 data ScannerCurLineMethodInfo
 data ScannerCurPositionMethodInfo
 data ScannerCurTokenMethodInfo
diff --git a/GI/GLib/Structs/ScannerConfig.hs b/GI/GLib/Structs/ScannerConfig.hs
--- a/GI/GLib/Structs/ScannerConfig.hs
+++ b/GI/GLib/Structs/ScannerConfig.hs
@@ -195,9 +195,14 @@
 import GI.GLib.Callbacks
 
 newtype ScannerConfig = ScannerConfig (ForeignPtr ScannerConfig)
+instance WrappedPtr ScannerConfig where
+    wrappedPtrCalloc = callocBytes 128
+    wrappedPtrCopy = copyPtr 128
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `ScannerConfig` struct initialized to zero.
 newZeroScannerConfig :: MonadIO m => m ScannerConfig
-newZeroScannerConfig = liftIO $ callocBytes 128 >>= wrapPtr ScannerConfig
+newZeroScannerConfig = liftIO $ wrappedPtrCalloc >>= wrapPtr ScannerConfig
 
 instance tag ~ 'AttrSet => Constructible ScannerConfig tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/ScannerConfig.hs-boot b/GI/GLib/Structs/ScannerConfig.hs-boot
--- a/GI/GLib/Structs/ScannerConfig.hs-boot
+++ b/GI/GLib/Structs/ScannerConfig.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype ScannerConfig = ScannerConfig (ForeignPtr ScannerConfig)
+instance WrappedPtr ScannerConfig where
diff --git a/GI/GLib/Structs/Sequence.hs b/GI/GLib/Structs/Sequence.hs
--- a/GI/GLib/Structs/Sequence.hs
+++ b/GI/GLib/Structs/Sequence.hs
@@ -67,6 +67,12 @@
 import GI.GLib.Callbacks
 
 newtype Sequence = Sequence (ForeignPtr Sequence)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr Sequence where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noSequence :: Maybe Sequence
 noSequence = Nothing
 
diff --git a/GI/GLib/Structs/Sequence.hs-boot b/GI/GLib/Structs/Sequence.hs-boot
--- a/GI/GLib/Structs/Sequence.hs-boot
+++ b/GI/GLib/Structs/Sequence.hs-boot
@@ -8,5 +8,6 @@
 import qualified Data.Map as Map
 
 newtype Sequence = Sequence (ForeignPtr Sequence)
+instance WrappedPtr Sequence where
 data SequenceFreeMethodInfo
 data SequenceGetLengthMethodInfo
diff --git a/GI/GLib/Structs/SequenceIter.hs b/GI/GLib/Structs/SequenceIter.hs
--- a/GI/GLib/Structs/SequenceIter.hs
+++ b/GI/GLib/Structs/SequenceIter.hs
@@ -53,6 +53,12 @@
 import GI.GLib.Callbacks
 
 newtype SequenceIter = SequenceIter (ForeignPtr SequenceIter)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr SequenceIter where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noSequenceIter :: Maybe SequenceIter
 noSequenceIter = Nothing
 
diff --git a/GI/GLib/Structs/SequenceIter.hs-boot b/GI/GLib/Structs/SequenceIter.hs-boot
--- a/GI/GLib/Structs/SequenceIter.hs-boot
+++ b/GI/GLib/Structs/SequenceIter.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype SequenceIter = SequenceIter (ForeignPtr SequenceIter)
+instance WrappedPtr SequenceIter where
 data SequenceIterCompareMethodInfo
 data SequenceIterGetPositionMethodInfo
 data SequenceIterIsBeginMethodInfo
diff --git a/GI/GLib/Structs/SourceCallbackFuncs.hs b/GI/GLib/Structs/SourceCallbackFuncs.hs
--- a/GI/GLib/Structs/SourceCallbackFuncs.hs
+++ b/GI/GLib/Structs/SourceCallbackFuncs.hs
@@ -31,9 +31,14 @@
 import GI.GLib.Callbacks
 
 newtype SourceCallbackFuncs = SourceCallbackFuncs (ForeignPtr SourceCallbackFuncs)
+instance WrappedPtr SourceCallbackFuncs where
+    wrappedPtrCalloc = callocBytes 24
+    wrappedPtrCopy = copyPtr 24
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `SourceCallbackFuncs` struct initialized to zero.
 newZeroSourceCallbackFuncs :: MonadIO m => m SourceCallbackFuncs
-newZeroSourceCallbackFuncs = liftIO $ callocBytes 24 >>= wrapPtr SourceCallbackFuncs
+newZeroSourceCallbackFuncs = liftIO $ wrappedPtrCalloc >>= wrapPtr SourceCallbackFuncs
 
 instance tag ~ 'AttrSet => Constructible SourceCallbackFuncs tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/SourceCallbackFuncs.hs-boot b/GI/GLib/Structs/SourceCallbackFuncs.hs-boot
--- a/GI/GLib/Structs/SourceCallbackFuncs.hs-boot
+++ b/GI/GLib/Structs/SourceCallbackFuncs.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype SourceCallbackFuncs = SourceCallbackFuncs (ForeignPtr SourceCallbackFuncs)
+instance WrappedPtr SourceCallbackFuncs where
diff --git a/GI/GLib/Structs/SourceFuncs.hs b/GI/GLib/Structs/SourceFuncs.hs
--- a/GI/GLib/Structs/SourceFuncs.hs
+++ b/GI/GLib/Structs/SourceFuncs.hs
@@ -49,9 +49,14 @@
 import GI.GLib.Callbacks
 
 newtype SourceFuncs = SourceFuncs (ForeignPtr SourceFuncs)
+instance WrappedPtr SourceFuncs where
+    wrappedPtrCalloc = callocBytes 48
+    wrappedPtrCopy = copyPtr 48
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `SourceFuncs` struct initialized to zero.
 newZeroSourceFuncs :: MonadIO m => m SourceFuncs
-newZeroSourceFuncs = liftIO $ callocBytes 48 >>= wrapPtr SourceFuncs
+newZeroSourceFuncs = liftIO $ wrappedPtrCalloc >>= wrapPtr SourceFuncs
 
 instance tag ~ 'AttrSet => Constructible SourceFuncs tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/SourceFuncs.hs-boot b/GI/GLib/Structs/SourceFuncs.hs-boot
--- a/GI/GLib/Structs/SourceFuncs.hs-boot
+++ b/GI/GLib/Structs/SourceFuncs.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype SourceFuncs = SourceFuncs (ForeignPtr SourceFuncs)
+instance WrappedPtr SourceFuncs where
diff --git a/GI/GLib/Structs/StatBuf.hs b/GI/GLib/Structs/StatBuf.hs
--- a/GI/GLib/Structs/StatBuf.hs
+++ b/GI/GLib/Structs/StatBuf.hs
@@ -32,6 +32,12 @@
 import GI.GLib.Callbacks
 
 newtype StatBuf = StatBuf (ForeignPtr StatBuf)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr StatBuf where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noStatBuf :: Maybe StatBuf
 noStatBuf = Nothing
 
diff --git a/GI/GLib/Structs/StatBuf.hs-boot b/GI/GLib/Structs/StatBuf.hs-boot
--- a/GI/GLib/Structs/StatBuf.hs-boot
+++ b/GI/GLib/Structs/StatBuf.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype StatBuf = StatBuf (ForeignPtr StatBuf)
+instance WrappedPtr StatBuf where
diff --git a/GI/GLib/Structs/StringChunk.hs b/GI/GLib/Structs/StringChunk.hs
--- a/GI/GLib/Structs/StringChunk.hs
+++ b/GI/GLib/Structs/StringChunk.hs
@@ -58,6 +58,12 @@
 import GI.GLib.Callbacks
 
 newtype StringChunk = StringChunk (ForeignPtr StringChunk)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr StringChunk where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noStringChunk :: Maybe StringChunk
 noStringChunk = Nothing
 
diff --git a/GI/GLib/Structs/StringChunk.hs-boot b/GI/GLib/Structs/StringChunk.hs-boot
--- a/GI/GLib/Structs/StringChunk.hs-boot
+++ b/GI/GLib/Structs/StringChunk.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype StringChunk = StringChunk (ForeignPtr StringChunk)
+instance WrappedPtr StringChunk where
 data StringChunkClearMethodInfo
 data StringChunkFreeMethodInfo
 data StringChunkInsertMethodInfo
diff --git a/GI/GLib/Structs/TestCase.hs b/GI/GLib/Structs/TestCase.hs
--- a/GI/GLib/Structs/TestCase.hs
+++ b/GI/GLib/Structs/TestCase.hs
@@ -29,6 +29,12 @@
 import GI.GLib.Callbacks
 
 newtype TestCase = TestCase (ForeignPtr TestCase)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr TestCase where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noTestCase :: Maybe TestCase
 noTestCase = Nothing
 
diff --git a/GI/GLib/Structs/TestCase.hs-boot b/GI/GLib/Structs/TestCase.hs-boot
--- a/GI/GLib/Structs/TestCase.hs-boot
+++ b/GI/GLib/Structs/TestCase.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TestCase = TestCase (ForeignPtr TestCase)
+instance WrappedPtr TestCase where
diff --git a/GI/GLib/Structs/TestConfig.hs b/GI/GLib/Structs/TestConfig.hs
--- a/GI/GLib/Structs/TestConfig.hs
+++ b/GI/GLib/Structs/TestConfig.hs
@@ -67,9 +67,14 @@
 import GI.GLib.Callbacks
 
 newtype TestConfig = TestConfig (ForeignPtr TestConfig)
+instance WrappedPtr TestConfig where
+    wrappedPtrCalloc = callocBytes 24
+    wrappedPtrCopy = copyPtr 24
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TestConfig` struct initialized to zero.
 newZeroTestConfig :: MonadIO m => m TestConfig
-newZeroTestConfig = liftIO $ callocBytes 24 >>= wrapPtr TestConfig
+newZeroTestConfig = liftIO $ wrappedPtrCalloc >>= wrapPtr TestConfig
 
 instance tag ~ 'AttrSet => Constructible TestConfig tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/TestConfig.hs-boot b/GI/GLib/Structs/TestConfig.hs-boot
--- a/GI/GLib/Structs/TestConfig.hs-boot
+++ b/GI/GLib/Structs/TestConfig.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TestConfig = TestConfig (ForeignPtr TestConfig)
+instance WrappedPtr TestConfig where
diff --git a/GI/GLib/Structs/TestLogBuffer.hs b/GI/GLib/Structs/TestLogBuffer.hs
--- a/GI/GLib/Structs/TestLogBuffer.hs
+++ b/GI/GLib/Structs/TestLogBuffer.hs
@@ -41,9 +41,14 @@
 import GI.GLib.Callbacks
 
 newtype TestLogBuffer = TestLogBuffer (ForeignPtr TestLogBuffer)
+instance WrappedPtr TestLogBuffer where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TestLogBuffer` struct initialized to zero.
 newZeroTestLogBuffer :: MonadIO m => m TestLogBuffer
-newZeroTestLogBuffer = liftIO $ callocBytes 16 >>= wrapPtr TestLogBuffer
+newZeroTestLogBuffer = liftIO $ wrappedPtrCalloc >>= wrapPtr TestLogBuffer
 
 instance tag ~ 'AttrSet => Constructible TestLogBuffer tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/TestLogBuffer.hs-boot b/GI/GLib/Structs/TestLogBuffer.hs-boot
--- a/GI/GLib/Structs/TestLogBuffer.hs-boot
+++ b/GI/GLib/Structs/TestLogBuffer.hs-boot
@@ -8,5 +8,6 @@
 import qualified Data.Map as Map
 
 newtype TestLogBuffer = TestLogBuffer (ForeignPtr TestLogBuffer)
+instance WrappedPtr TestLogBuffer where
 data TestLogBufferFreeMethodInfo
 data TestLogBufferPushMethodInfo
diff --git a/GI/GLib/Structs/TestLogMsg.hs b/GI/GLib/Structs/TestLogMsg.hs
--- a/GI/GLib/Structs/TestLogMsg.hs
+++ b/GI/GLib/Structs/TestLogMsg.hs
@@ -70,9 +70,14 @@
 import GI.GLib.Callbacks
 
 newtype TestLogMsg = TestLogMsg (ForeignPtr TestLogMsg)
+instance WrappedPtr TestLogMsg where
+    wrappedPtrCalloc = callocBytes 32
+    wrappedPtrCopy = copyPtr 32
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TestLogMsg` struct initialized to zero.
 newZeroTestLogMsg :: MonadIO m => m TestLogMsg
-newZeroTestLogMsg = liftIO $ callocBytes 32 >>= wrapPtr TestLogMsg
+newZeroTestLogMsg = liftIO $ wrappedPtrCalloc >>= wrapPtr TestLogMsg
 
 instance tag ~ 'AttrSet => Constructible TestLogMsg tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/TestLogMsg.hs-boot b/GI/GLib/Structs/TestLogMsg.hs-boot
--- a/GI/GLib/Structs/TestLogMsg.hs-boot
+++ b/GI/GLib/Structs/TestLogMsg.hs-boot
@@ -8,4 +8,5 @@
 import qualified Data.Map as Map
 
 newtype TestLogMsg = TestLogMsg (ForeignPtr TestLogMsg)
+instance WrappedPtr TestLogMsg where
 data TestLogMsgFreeMethodInfo
diff --git a/GI/GLib/Structs/TestSuite.hs b/GI/GLib/Structs/TestSuite.hs
--- a/GI/GLib/Structs/TestSuite.hs
+++ b/GI/GLib/Structs/TestSuite.hs
@@ -42,6 +42,12 @@
 import GI.GLib.Callbacks
 
 newtype TestSuite = TestSuite (ForeignPtr TestSuite)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr TestSuite where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noTestSuite :: Maybe TestSuite
 noTestSuite = Nothing
 
diff --git a/GI/GLib/Structs/TestSuite.hs-boot b/GI/GLib/Structs/TestSuite.hs-boot
--- a/GI/GLib/Structs/TestSuite.hs-boot
+++ b/GI/GLib/Structs/TestSuite.hs-boot
@@ -8,5 +8,6 @@
 import qualified Data.Map as Map
 
 newtype TestSuite = TestSuite (ForeignPtr TestSuite)
+instance WrappedPtr TestSuite where
 data TestSuiteAddMethodInfo
 data TestSuiteAddSuiteMethodInfo
diff --git a/GI/GLib/Structs/ThreadPool.hs b/GI/GLib/Structs/ThreadPool.hs
--- a/GI/GLib/Structs/ThreadPool.hs
+++ b/GI/GLib/Structs/ThreadPool.hs
@@ -110,9 +110,14 @@
 import GI.GLib.Callbacks
 
 newtype ThreadPool = ThreadPool (ForeignPtr ThreadPool)
+instance WrappedPtr ThreadPool where
+    wrappedPtrCalloc = callocBytes 24
+    wrappedPtrCopy = copyPtr 24
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `ThreadPool` struct initialized to zero.
 newZeroThreadPool :: MonadIO m => m ThreadPool
-newZeroThreadPool = liftIO $ callocBytes 24 >>= wrapPtr ThreadPool
+newZeroThreadPool = liftIO $ wrappedPtrCalloc >>= wrapPtr ThreadPool
 
 instance tag ~ 'AttrSet => Constructible ThreadPool tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/ThreadPool.hs-boot b/GI/GLib/Structs/ThreadPool.hs-boot
--- a/GI/GLib/Structs/ThreadPool.hs-boot
+++ b/GI/GLib/Structs/ThreadPool.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype ThreadPool = ThreadPool (ForeignPtr ThreadPool)
+instance WrappedPtr ThreadPool where
 data ThreadPoolFreeMethodInfo
 data ThreadPoolGetMaxThreadsMethodInfo
 data ThreadPoolGetNumThreadsMethodInfo
diff --git a/GI/GLib/Structs/TimeVal.hs b/GI/GLib/Structs/TimeVal.hs
--- a/GI/GLib/Structs/TimeVal.hs
+++ b/GI/GLib/Structs/TimeVal.hs
@@ -68,9 +68,14 @@
 import GI.GLib.Callbacks
 
 newtype TimeVal = TimeVal (ForeignPtr TimeVal)
+instance WrappedPtr TimeVal where
+    wrappedPtrCalloc = callocBytes 16
+    wrappedPtrCopy = copyPtr 16
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TimeVal` struct initialized to zero.
 newZeroTimeVal :: MonadIO m => m TimeVal
-newZeroTimeVal = liftIO $ callocBytes 16 >>= wrapPtr TimeVal
+newZeroTimeVal = liftIO $ wrappedPtrCalloc >>= wrapPtr TimeVal
 
 instance tag ~ 'AttrSet => Constructible TimeVal tag where
     new _ attrs = do
diff --git a/GI/GLib/Structs/TimeVal.hs-boot b/GI/GLib/Structs/TimeVal.hs-boot
--- a/GI/GLib/Structs/TimeVal.hs-boot
+++ b/GI/GLib/Structs/TimeVal.hs-boot
@@ -8,5 +8,6 @@
 import qualified Data.Map as Map
 
 newtype TimeVal = TimeVal (ForeignPtr TimeVal)
+instance WrappedPtr TimeVal where
 data TimeValAddMethodInfo
 data TimeValToIso8601MethodInfo
diff --git a/GI/GLib/Structs/Timer.hs b/GI/GLib/Structs/Timer.hs
--- a/GI/GLib/Structs/Timer.hs
+++ b/GI/GLib/Structs/Timer.hs
@@ -62,6 +62,12 @@
 import GI.GLib.Callbacks
 
 newtype Timer = Timer (ForeignPtr Timer)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr Timer where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noTimer :: Maybe Timer
 noTimer = Nothing
 
diff --git a/GI/GLib/Structs/Timer.hs-boot b/GI/GLib/Structs/Timer.hs-boot
--- a/GI/GLib/Structs/Timer.hs-boot
+++ b/GI/GLib/Structs/Timer.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Timer = Timer (ForeignPtr Timer)
+instance WrappedPtr Timer where
 data TimerContinueMethodInfo
 data TimerDestroyMethodInfo
 data TimerElapsedMethodInfo
diff --git a/GI/GLib/Structs/TrashStack.hs b/GI/GLib/Structs/TrashStack.hs
--- a/GI/GLib/Structs/TrashStack.hs
+++ b/GI/GLib/Structs/TrashStack.hs
@@ -52,9 +52,14 @@
 import GI.GLib.Callbacks
 
 newtype TrashStack = TrashStack (ForeignPtr TrashStack)
+instance WrappedPtr TrashStack where
+    wrappedPtrCalloc = callocBytes 8
+    wrappedPtrCopy = copyPtr 8
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TrashStack` struct initialized to zero.
 newZeroTrashStack :: MonadIO m => m TrashStack
-newZeroTrashStack = liftIO $ callocBytes 8 >>= wrapPtr TrashStack
+newZeroTrashStack = liftIO $ wrappedPtrCalloc >>= wrapPtr TrashStack
 
 instance tag ~ 'AttrSet => Constructible TrashStack tag where
     new _ attrs = do
@@ -70,7 +75,7 @@
 trashStackReadNext s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr TrashStack)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 8 TrashStack) val'
+        val'' <- (newPtr TrashStack) val'
         return val''
     return result
 
diff --git a/GI/GLib/Structs/TrashStack.hs-boot b/GI/GLib/Structs/TrashStack.hs-boot
--- a/GI/GLib/Structs/TrashStack.hs-boot
+++ b/GI/GLib/Structs/TrashStack.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TrashStack = TrashStack (ForeignPtr TrashStack)
+instance WrappedPtr TrashStack where
diff --git a/GI/GLib/Structs/Tree.hs b/GI/GLib/Structs/Tree.hs
--- a/GI/GLib/Structs/Tree.hs
+++ b/GI/GLib/Structs/Tree.hs
@@ -79,6 +79,12 @@
 import GI.GLib.Callbacks
 
 newtype Tree = Tree (ForeignPtr Tree)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr Tree where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noTree :: Maybe Tree
 noTree = Nothing
 
diff --git a/GI/GLib/Structs/Tree.hs-boot b/GI/GLib/Structs/Tree.hs-boot
--- a/GI/GLib/Structs/Tree.hs-boot
+++ b/GI/GLib/Structs/Tree.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Tree = Tree (ForeignPtr Tree)
+instance WrappedPtr Tree where
 data TreeDestroyMethodInfo
 data TreeHeightMethodInfo
 data TreeInsertMethodInfo
diff --git a/GI/GLib/Unions/DoubleIEEE754.hs b/GI/GLib/Unions/DoubleIEEE754.hs
--- a/GI/GLib/Unions/DoubleIEEE754.hs
+++ b/GI/GLib/Unions/DoubleIEEE754.hs
@@ -37,9 +37,14 @@
 import GI.GLib.Callbacks
 
 newtype DoubleIEEE754 = DoubleIEEE754 (ForeignPtr DoubleIEEE754)
+instance WrappedPtr DoubleIEEE754 where
+    wrappedPtrCalloc = callocBytes 8
+    wrappedPtrCopy = copyPtr 8
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `DoubleIEEE754` struct initialized to zero.
 newZeroDoubleIEEE754 :: MonadIO m => m DoubleIEEE754
-newZeroDoubleIEEE754 = liftIO $ callocBytes 8 >>= wrapPtr DoubleIEEE754
+newZeroDoubleIEEE754 = liftIO $ wrappedPtrCalloc >>= wrapPtr DoubleIEEE754
 
 instance tag ~ 'AttrSet => Constructible DoubleIEEE754 tag where
     new _ attrs = do
diff --git a/GI/GLib/Unions/DoubleIEEE754.hs-boot b/GI/GLib/Unions/DoubleIEEE754.hs-boot
--- a/GI/GLib/Unions/DoubleIEEE754.hs-boot
+++ b/GI/GLib/Unions/DoubleIEEE754.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype DoubleIEEE754 = DoubleIEEE754 (ForeignPtr DoubleIEEE754)
+instance WrappedPtr DoubleIEEE754 where
diff --git a/GI/GLib/Unions/FloatIEEE754.hs b/GI/GLib/Unions/FloatIEEE754.hs
--- a/GI/GLib/Unions/FloatIEEE754.hs
+++ b/GI/GLib/Unions/FloatIEEE754.hs
@@ -37,9 +37,14 @@
 import GI.GLib.Callbacks
 
 newtype FloatIEEE754 = FloatIEEE754 (ForeignPtr FloatIEEE754)
+instance WrappedPtr FloatIEEE754 where
+    wrappedPtrCalloc = callocBytes 4
+    wrappedPtrCopy = copyPtr 4
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `FloatIEEE754` struct initialized to zero.
 newZeroFloatIEEE754 :: MonadIO m => m FloatIEEE754
-newZeroFloatIEEE754 = liftIO $ callocBytes 4 >>= wrapPtr FloatIEEE754
+newZeroFloatIEEE754 = liftIO $ wrappedPtrCalloc >>= wrapPtr FloatIEEE754
 
 instance tag ~ 'AttrSet => Constructible FloatIEEE754 tag where
     new _ attrs = do
diff --git a/GI/GLib/Unions/FloatIEEE754.hs-boot b/GI/GLib/Unions/FloatIEEE754.hs-boot
--- a/GI/GLib/Unions/FloatIEEE754.hs-boot
+++ b/GI/GLib/Unions/FloatIEEE754.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype FloatIEEE754 = FloatIEEE754 (ForeignPtr FloatIEEE754)
+instance WrappedPtr FloatIEEE754 where
diff --git a/GI/GLib/Unions/Mutex.hs b/GI/GLib/Unions/Mutex.hs
--- a/GI/GLib/Unions/Mutex.hs
+++ b/GI/GLib/Unions/Mutex.hs
@@ -56,9 +56,14 @@
 import GI.GLib.Callbacks
 
 newtype Mutex = Mutex (ForeignPtr Mutex)
+instance WrappedPtr Mutex where
+    wrappedPtrCalloc = callocBytes 8
+    wrappedPtrCopy = copyPtr 8
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Mutex` struct initialized to zero.
 newZeroMutex :: MonadIO m => m Mutex
-newZeroMutex = liftIO $ callocBytes 8 >>= wrapPtr Mutex
+newZeroMutex = liftIO $ wrappedPtrCalloc >>= wrapPtr Mutex
 
 instance tag ~ 'AttrSet => Constructible Mutex tag where
     new _ attrs = do
diff --git a/GI/GLib/Unions/Mutex.hs-boot b/GI/GLib/Unions/Mutex.hs-boot
--- a/GI/GLib/Unions/Mutex.hs-boot
+++ b/GI/GLib/Unions/Mutex.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Mutex = Mutex (ForeignPtr Mutex)
+instance WrappedPtr Mutex where
 data MutexClearMethodInfo
 data MutexInitMethodInfo
 data MutexLockMethodInfo
diff --git a/GI/GLib/Unions/TokenValue.hs b/GI/GLib/Unions/TokenValue.hs
--- a/GI/GLib/Unions/TokenValue.hs
+++ b/GI/GLib/Unions/TokenValue.hs
@@ -107,9 +107,14 @@
 import GI.GLib.Callbacks
 
 newtype TokenValue = TokenValue (ForeignPtr TokenValue)
+instance WrappedPtr TokenValue where
+    wrappedPtrCalloc = callocBytes 8
+    wrappedPtrCopy = copyPtr 8
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TokenValue` struct initialized to zero.
 newZeroTokenValue :: MonadIO m => m TokenValue
-newZeroTokenValue = liftIO $ callocBytes 8 >>= wrapPtr TokenValue
+newZeroTokenValue = liftIO $ wrappedPtrCalloc >>= wrapPtr TokenValue
 
 instance tag ~ 'AttrSet => Constructible TokenValue tag where
     new _ attrs = do
diff --git a/GI/GLib/Unions/TokenValue.hs-boot b/GI/GLib/Unions/TokenValue.hs-boot
--- a/GI/GLib/Unions/TokenValue.hs-boot
+++ b/GI/GLib/Unions/TokenValue.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TokenValue = TokenValue (ForeignPtr TokenValue)
+instance WrappedPtr TokenValue where
diff --git a/gi-glib.cabal b/gi-glib.cabal
--- a/gi-glib.cabal
+++ b/gi-glib.cabal
@@ -1,6 +1,6 @@
 -- Autogenerated, do not edit.
 name:               gi-glib
-version:            0.2.46.14
+version:            0.2.46.15
 synopsis:           GLib bindings
 description:        Bindings for GLib, autogenerated by haskell-gi.
 homepage:           https://github.com/haskell-gi/haskell-gi
@@ -96,7 +96,7 @@
                         GI.GLib.Unions.TokenValue
     pkgconfig-depends:  glib-2.0 >= 2.46
     build-depends: base >= 4.7 && <5,
-        haskell-gi-base >= 0.14 && < 1,
+        haskell-gi-base >= 0.15 && < 1,
         bytestring >= 0.10,
         containers >= 0.5,
         text >= 1.0,
