diff --git a/GI/GIRepository/Objects/Repository.hs b/GI/GIRepository/Objects/Repository.hs
--- a/GI/GIRepository/Objects/Repository.hs
+++ b/GI/GIRepository/Objects/Repository.hs
@@ -769,8 +769,7 @@
     onException (do
         result <- propagateGError $ g_irepository_require _obj' namespace_' maybeVersion flags'
         checkUnexpectedReturnNULL "g_irepository_require" result
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        result' <- (\x -> Typelib <$> newForeignPtr_ x) result
+        result' <- (newPtr Typelib) result
         touchManagedPtr _obj
         freeMem namespace_'
         freeMem maybeVersion
@@ -823,8 +822,7 @@
     onException (do
         result <- propagateGError $ g_irepository_require_private _obj' typelibDir' namespace_' maybeVersion flags'
         checkUnexpectedReturnNULL "g_irepository_require_private" result
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        result' <- (\x -> Typelib <$> newForeignPtr_ x) result
+        result' <- (newPtr Typelib) result
         touchManagedPtr _obj
         freeMem typelibDir'
         freeMem namespace_'
diff --git a/GI/GIRepository/Structs/AttributeIter.hs b/GI/GIRepository/Structs/AttributeIter.hs
--- a/GI/GIRepository/Structs/AttributeIter.hs
+++ b/GI/GIRepository/Structs/AttributeIter.hs
@@ -31,9 +31,14 @@
 import GI.GIRepository.Callbacks
 
 newtype AttributeIter = AttributeIter (ForeignPtr AttributeIter)
+instance WrappedPtr AttributeIter where
+    wrappedPtrCalloc = callocBytes 32
+    wrappedPtrCopy = copyPtr 32
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `AttributeIter` struct initialized to zero.
 newZeroAttributeIter :: MonadIO m => m AttributeIter
-newZeroAttributeIter = liftIO $ callocBytes 32 >>= wrapPtr AttributeIter
+newZeroAttributeIter = liftIO $ wrappedPtrCalloc >>= wrapPtr AttributeIter
 
 instance tag ~ 'AttrSet => Constructible AttributeIter tag where
     new _ attrs = do
diff --git a/GI/GIRepository/Structs/AttributeIter.hs-boot b/GI/GIRepository/Structs/AttributeIter.hs-boot
--- a/GI/GIRepository/Structs/AttributeIter.hs-boot
+++ b/GI/GIRepository/Structs/AttributeIter.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype AttributeIter = AttributeIter (ForeignPtr AttributeIter)
+instance WrappedPtr AttributeIter where
diff --git a/GI/GIRepository/Structs/BaseInfo.hs b/GI/GIRepository/Structs/BaseInfo.hs
--- a/GI/GIRepository/Structs/BaseInfo.hs
+++ b/GI/GIRepository/Structs/BaseInfo.hs
@@ -339,8 +339,7 @@
     let _obj' = unsafeManagedPtrGetPtr _obj
     result <- g_base_info_get_typelib _obj'
     checkUnexpectedReturnNULL "g_base_info_get_typelib" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Typelib <$> newForeignPtr_ x) result
+    result' <- (newPtr Typelib) result
     touchManagedPtr _obj
     return result'
 
diff --git a/GI/GIRepository/Structs/Typelib.hs b/GI/GIRepository/Structs/Typelib.hs
--- a/GI/GIRepository/Structs/Typelib.hs
+++ b/GI/GIRepository/Structs/Typelib.hs
@@ -47,6 +47,12 @@
 import GI.GIRepository.Callbacks
 
 newtype Typelib = Typelib (ForeignPtr Typelib)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr Typelib where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noTypelib :: Maybe Typelib
 noTypelib = Nothing
 
diff --git a/GI/GIRepository/Structs/Typelib.hs-boot b/GI/GIRepository/Structs/Typelib.hs-boot
--- a/GI/GIRepository/Structs/Typelib.hs-boot
+++ b/GI/GIRepository/Structs/Typelib.hs-boot
@@ -8,6 +8,7 @@
 import qualified Data.Map as Map
 
 newtype Typelib = Typelib (ForeignPtr Typelib)
+instance WrappedPtr Typelib where
 data TypelibFreeMethodInfo
 data TypelibGetNamespaceMethodInfo
 data TypelibSymbolMethodInfo
diff --git a/GI/GIRepository/Structs/UnresolvedInfo.hs b/GI/GIRepository/Structs/UnresolvedInfo.hs
--- a/GI/GIRepository/Structs/UnresolvedInfo.hs
+++ b/GI/GIRepository/Structs/UnresolvedInfo.hs
@@ -29,6 +29,12 @@
 import GI.GIRepository.Callbacks
 
 newtype UnresolvedInfo = UnresolvedInfo (ForeignPtr UnresolvedInfo)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr UnresolvedInfo where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noUnresolvedInfo :: Maybe UnresolvedInfo
 noUnresolvedInfo = Nothing
 
diff --git a/GI/GIRepository/Structs/UnresolvedInfo.hs-boot b/GI/GIRepository/Structs/UnresolvedInfo.hs-boot
--- a/GI/GIRepository/Structs/UnresolvedInfo.hs-boot
+++ b/GI/GIRepository/Structs/UnresolvedInfo.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype UnresolvedInfo = UnresolvedInfo (ForeignPtr UnresolvedInfo)
+instance WrappedPtr UnresolvedInfo where
diff --git a/GI/GIRepository/Unions/Argument.hs b/GI/GIRepository/Unions/Argument.hs
--- a/GI/GIRepository/Unions/Argument.hs
+++ b/GI/GIRepository/Unions/Argument.hs
@@ -159,9 +159,14 @@
 import GI.GIRepository.Callbacks
 
 newtype Argument = Argument (ForeignPtr Argument)
+instance WrappedPtr Argument where
+    wrappedPtrCalloc = callocBytes 8
+    wrappedPtrCopy = copyPtr 8
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Argument` struct initialized to zero.
 newZeroArgument :: MonadIO m => m Argument
-newZeroArgument = liftIO $ callocBytes 8 >>= wrapPtr Argument
+newZeroArgument = liftIO $ wrappedPtrCalloc >>= wrapPtr Argument
 
 instance tag ~ 'AttrSet => Constructible Argument tag where
     new _ attrs = do
diff --git a/GI/GIRepository/Unions/Argument.hs-boot b/GI/GIRepository/Unions/Argument.hs-boot
--- a/GI/GIRepository/Unions/Argument.hs-boot
+++ b/GI/GIRepository/Unions/Argument.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype Argument = Argument (ForeignPtr Argument)
+instance WrappedPtr Argument where
diff --git a/gi-girepository.cabal b/gi-girepository.cabal
--- a/gi-girepository.cabal
+++ b/gi-girepository.cabal
@@ -1,6 +1,6 @@
 -- Autogenerated, do not edit.
 name:               gi-girepository
-version:            0.1.46.14
+version:            0.1.46.15
 synopsis:           GIRepository bindings
 description:        Bindings for GIRepository, autogenerated by haskell-gi.
 homepage:           https://github.com/haskell-gi/haskell-gi
@@ -34,8 +34,8 @@
                         GI.GIRepository.Unions.Argument
     pkgconfig-depends:  gobject-introspection-1.0 >= 1.46
     build-depends: base >= 4.7 && <5,
-        haskell-gi-base >= 0.14 && < 1,
-        gi-gobject >= 0.2.46.14 && < 0.2.47,
+        haskell-gi-base >= 0.15 && < 1,
+        gi-gobject >= 0.2.46.15 && < 0.2.47,
         bytestring >= 0.10,
         containers >= 0.5,
         text >= 1.0,
