diff --git a/reference-counting.cabal b/reference-counting.cabal
--- a/reference-counting.cabal
+++ b/reference-counting.cabal
@@ -20,7 +20,7 @@
 -- PVP summary:     +-+------- breaking API changes
 --                  | | +----- non-breaking API additions
 --                  | | | +--- code changes with no API change
-version:            0.1.0.0
+version:            0.2.0.0
 
 -- A short (one-line) description of the package.
 synopsis: A reference counting library to alias linear resources
@@ -44,7 +44,7 @@
 
 category:           Data
 build-type:         Simple
-tested-with:        GHC ==9.8.2
+tested-with:        GHC ==9.12.2
 
 extra-doc-files:    CHANGELOG.md
                     README.md
@@ -69,7 +69,7 @@
                       atomic-counter >= 0.1.2 && < 0.2,
 
                       -- only for instances of Aliasable
-                      containers >= 0.6 && < 0.7,
+                      containers >= 0.6 && < 0.8,
 
     hs-source-dirs:   src
     default-language: GHC2021
diff --git a/src/Data/Linear/Alias.hs b/src/Data/Linear/Alias.hs
--- a/src/Data/Linear/Alias.hs
+++ b/src/Data/Linear/Alias.hs
@@ -43,11 +43,10 @@
     => (a ⊸ μ ()) -- ^ Function to free resource when the last alias is released
      ⊸ a          -- ^ The resource to alias
      ⊸ m (Alias μ a)
-newAlias freeC x = Linear.do
+newAlias = Unsafe.toLinear \freeC x -> Linear.do
   Ur c <- liftSystemIOU $ Counter.new 1
   pure $ Alias freeC c x
 
-
 -- | This function returns a value that is aliased in a linear pair with a
 -- function to free the linear value. Since both the value and freeing function
 -- must be consumed linearly, it is guaranteed that the returned function is
@@ -110,8 +109,9 @@
 
 
 hoist :: MonadIO m => ((a ⊸ m ()) ⊸ b ⊸ μ ()) ⊸ (a ⊸ b) ⊸ Alias m a ⊸ Alias μ b
-hoist freeAB f (Alias freeA counter x) = Alias (freeAB freeA) counter (f x)
+hoist = Unsafe.toLinear \freeAB f (Alias freeA counter x) -> Alias (freeAB freeA) counter (f x)
 
+{-# INLINABLE get #-}
 
 ----- Signature classes -----
 
@@ -135,6 +135,7 @@
        else
          -- No-op
          pure (Unsafe.toLinear (\_ -> ()) x)
+  {-# INLINE forget #-} -- this was showing up in profiles
 
 class Shareable m a where
   -- | Share a linear resource
@@ -155,7 +156,7 @@
     consume <$>
       traverse' (\(SomeAlias alias) -> Linear.do
         a' <- Unsafe.Alias.inc alias -- increment reference count
-        Unsafe.toLinear const (pure ()) a') (countedFields x)
+        Unsafe.toLinear2 const (pure ()) a') (countedFields x)
 
     -- It's safe to return two references to the pointer because we've
     -- incremented the reference count of all nested aliases. Both references must be used
@@ -170,6 +171,7 @@
     -- Implement manually since there is no Generic instance for Alias
     alias' <- Unsafe.Alias.inc alias'' 
     pure $ Unsafe.toLinear (\alias -> (alias, alias)) alias'
+  {-# INLINE share #-} -- this was showing up in profiles
 
 instance (Generic a, Fields (Rep a)) => Shareable m (Generically a) where
   share = Unsafe.toLinear $ \(Generically x) -> Linear.do
@@ -177,7 +179,7 @@
     consume <$>
       traverse' (\(SomeAlias alias) -> Linear.do
         a' <- Unsafe.Alias.inc alias -- increment reference count
-        Unsafe.toLinear const (pure ()) a') (countedFields x)
+        Unsafe.toLinear2 const (pure ()) a') (countedFields x)
     return (Generically x, Generically x)
 
 -- Just like 'share', but doesn't require the action to be performed whithin
@@ -213,7 +215,7 @@
   {-# INLINE forget #-}
 
 instance Forgettable m a => Forgettable m (IM.IntMap a) where
-  forget im = consume <$> traverse' forget (IM.elems im)
+  forget im = consume <$> traverse' forget (Unsafe.toLinear IM.elems im)
   {-# INLINE forget #-}
 
 instance Forgettable m a => Forgettable m [a] where
@@ -229,7 +231,7 @@
 
 instance Shareable m a => Shareable m (IM.IntMap a) where
   share im = B.bimap (Unsafe.toLinear IM.fromList) (Unsafe.toLinear IM.fromList) . unzip <$>
-             traverse' share (IM.toList im)
+             traverse' share (Unsafe.toLinear IM.toList im)
   {-# INLINE share #-}
 
 instance Shareable m a => Shareable m [a] where
@@ -238,6 +240,8 @@
 
 instance Forgettable m Int where
   forget = pure . consume
+  {-# INLINE forget #-}
 instance Shareable m Int where
   share = pure . dup2
+  {-# INLINE share #-}
 
diff --git a/src/Data/Linear/Alias/Unsafe.hs b/src/Data/Linear/Alias/Unsafe.hs
--- a/src/Data/Linear/Alias/Unsafe.hs
+++ b/src/Data/Linear/Alias/Unsafe.hs
@@ -42,3 +42,7 @@
 get :: Alias m' a -> a
 get (Alias _ _ a) = a
 
+-- We always want MonadIO to specialise here, and really it might as well just be inlined.
+-- (This showed up in ghengin profiles!)
+{-# INLINE inc #-}
+{-# INLINE dec #-}
