diff --git a/Foreign/C/String/Region.hs b/Foreign/C/String/Region.hs
--- a/Foreign/C/String/Region.hs
+++ b/Foreign/C/String/Region.hs
@@ -89,11 +89,9 @@
 -- from transformers:
 import Control.Monad.IO.Class            ( MonadIO, liftIO )
 
--- from monad-control:
-import Control.Monad.IO.Control          ( MonadControlIO )
-
 -- from regions:
 import Control.Monad.Trans.Region        ( RegionT
+                                         , RegionControlIO
                                          , AncestorRegion
                                          , LocalRegion, Local
                                          )
@@ -152,7 +150,7 @@
 -- The Haskell string may /not/ contain any NUL characters
 --
 -- Wraps: @Foreign.C.String.'FCS.newCString'@.
-newCString ∷ MonadControlIO pr
+newCString ∷ RegionControlIO pr
            ⇒ String → RegionT s pr (RegionalCString RegionalPtr (RegionT s pr))
 newCString = wrapMalloc ∘ FCS.newCString
 
@@ -160,7 +158,7 @@
 -- explicit length information.
 --
 -- Wraps: @Foreign.C.String.'FCS.newCStringLen'@.
-newCStringLen ∷ MonadControlIO pr
+newCStringLen ∷ RegionControlIO pr
               ⇒ String → RegionT s pr (RegionalCStringLen RegionalPtr (RegionT s pr))
 newCStringLen = wrapNewStringLen ∘ FCS.newCStringLen
 
@@ -173,7 +171,7 @@
 --   via an exception).
 --
 -- Wraps: @Foreign.C.String.'FCS.withCString'@.
-withCString ∷ MonadControlIO pr
+withCString ∷ RegionControlIO pr
             ⇒ String
             → (∀ sl. RegionalCString LocalPtr (LocalRegion sl s)
                    → RegionT (Local s) pr α
@@ -188,7 +186,7 @@
 --   via an exception).
 --
 -- Wraps: @Foreign.C.String.'FCS.withCStringLen'@.
-withCStringLen ∷ MonadControlIO pr
+withCStringLen ∷ RegionControlIO pr
                ⇒ String
                → (∀ sl. RegionalCStringLen LocalPtr (LocalRegion sl s)
                       → RegionT (Local s) pr α
@@ -224,7 +222,7 @@
 -- The Haskell string may /not/ contain any NUL characters
 --
 -- Wraps: @Foreign.C.String.'FCS.newCAString'@.
-newCAString ∷ MonadControlIO pr
+newCAString ∷ RegionControlIO pr
             ⇒ String → RegionT s pr (RegionalCString RegionalPtr (RegionT s pr))
 newCAString = wrapMalloc ∘ FCS.newCAString
 
@@ -232,7 +230,7 @@
 -- explicit length information.
 --
 -- Wraps: @Foreign.C.String.'FCS.newCAStringLen'@.
-newCAStringLen ∷ MonadControlIO pr
+newCAStringLen ∷ RegionControlIO pr
                ⇒ String → RegionT s pr (RegionalCStringLen RegionalPtr (RegionT s pr))
 newCAStringLen = wrapNewStringLen ∘ FCS.newCAStringLen
 
@@ -245,7 +243,7 @@
 -- via an exception).
 --
 -- Wraps: @Foreign.C.String.'FCS.withCAString'@.
-withCAString ∷ MonadControlIO pr
+withCAString ∷ RegionControlIO pr
              ⇒ String
              → (∀ sl. RegionalCString LocalPtr (LocalRegion sl s)
                     → RegionT (Local s) pr α
@@ -260,7 +258,7 @@
 --   via an exception).
 --
 -- Wraps: @Foreign.C.String.'FCS.withCAStringLen'@.
-withCAStringLen ∷ MonadControlIO pr
+withCAStringLen ∷ RegionControlIO pr
                 ⇒ String
                 → (∀ sl. RegionalCStringLen LocalPtr (LocalRegion sl s)
                        → RegionT (Local s) pr α
@@ -305,7 +303,7 @@
 -- The Haskell string may /not/ contain any NUL characters.
 --
 -- Wraps: @Foreign.C.String.'FCS.newCWString'@.
-newCWString ∷ MonadControlIO pr
+newCWString ∷ RegionControlIO pr
             ⇒ String → RegionT s pr (RegionalCWString RegionalPtr (RegionT s pr))
 newCWString = wrapMalloc ∘ FCS.newCWString
 
@@ -313,7 +311,7 @@
 -- with explicit length information.
 --
 -- Wraps: @Foreign.C.String.'FCS.newCWStringLen'@.
-newCWStringLen ∷ MonadControlIO pr
+newCWStringLen ∷ RegionControlIO pr
                ⇒ String → RegionT s pr (RegionalCWStringLen RegionalPtr (RegionT s pr))
 newCWStringLen = wrapNewStringLen ∘ FCS.newCWStringLen
 
@@ -326,7 +324,7 @@
 --   normally or via an exception).
 --
 -- Wraps: @Foreign.C.String.'FCS.withCWString'@.
-withCWString ∷ MonadControlIO pr
+withCWString ∷ RegionControlIO pr
              ⇒ String
              → (∀ sl. RegionalCWString LocalPtr (LocalRegion sl s)
                     → RegionT (Local s) pr α
@@ -343,7 +341,7 @@
 --   normally or via an exception).
 --
 -- Wraps: @Foreign.C.String.'FCS.withCWStringLen'@.
-withCWStringLen ∷ MonadControlIO pr
+withCWStringLen ∷ RegionControlIO pr
                 ⇒ String
                 → (∀ sl. RegionalCWStringLen LocalPtr (LocalRegion sl s)
                        → RegionT (Local s) pr α
diff --git a/Foreign/Marshal/Alloc/Region.hs b/Foreign/Marshal/Alloc/Region.hs
--- a/Foreign/Marshal/Alloc/Region.hs
+++ b/Foreign/Marshal/Alloc/Region.hs
@@ -44,19 +44,16 @@
 #endif
 
 #if __HADDOCK__
-import Foreign.Storable                       ( sizeOf )
+import Foreign.Storable ( sizeOf )
 #endif
 
--- from monad-control:
-import Control.Monad.IO.Control               ( MonadControlIO )
-
 -- from regions:
-import Control.Monad.Trans.Region             ( RegionT, LocalRegion, Local )
+import Control.Monad.Trans.Region ( RegionT, RegionControlIO, LocalRegion, Local )
 
 -- from ourselves:
-import Foreign.Ptr.Region                     ( RegionalPtr,  )
-import Foreign.Ptr.Region.Internal            ( LocalPtr )
-import Foreign.Ptr.Region.Unsafe              ( wrapAlloca, wrapMalloc )
+import Foreign.Ptr.Region          ( RegionalPtr,  )
+import Foreign.Ptr.Region.Internal ( LocalPtr )
+import Foreign.Ptr.Region.Unsafe   ( wrapAlloca, wrapMalloc )
 
 
 --------------------------------------------------------------------------------
@@ -72,7 +69,7 @@
 This should provide a safer replacement for:
 @Foreign.Marshal.Alloc.'FMA.alloca'@.
 -}
-alloca ∷ (Storable α, MonadControlIO pr)
+alloca ∷ (Storable α, RegionControlIO pr)
        ⇒ (∀ sl. LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
        → RegionT s pr β
 alloca = wrapAlloca FMA.alloca
@@ -88,7 +85,7 @@
 This should provide a safer replacement for:
 @Foreign.Marshal.Alloc.'FMA.allocaBytes'@.
 -}
-allocaBytes ∷ MonadControlIO pr
+allocaBytes ∷ RegionControlIO pr
             ⇒ Int
             → (∀ sl. LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
             → RegionT s pr β
@@ -98,7 +95,7 @@
 -- | This should provide a safer replacement for:
 -- @Foreign.Marshal.Alloc.'FMA.allocaBytesAligned'@.
 allocaBytesAligned ∷
-    MonadControlIO pr
+    RegionControlIO pr
   ⇒ Int → Int
   → (∀ sl. LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
   → RegionT s pr β
@@ -118,7 +115,7 @@
 This should provide a safer replacement for:
 @Foreign.Marshal.Alloc.'FMA.malloc'@.
 -}
-malloc ∷ ∀ α pr s. (Storable α, MonadControlIO pr)
+malloc ∷ ∀ α pr s. (Storable α, RegionControlIO pr)
        ⇒ RegionT s pr (RegionalPtr α (RegionT s pr))
 malloc = wrapMalloc FMA.malloc
 
@@ -130,7 +127,7 @@
 This should provide a safer replacement for:
 @Foreign.Marshal.Alloc.'FMA.mallocBytes'@.
 -}
-mallocBytes ∷ MonadControlIO pr
+mallocBytes ∷ RegionControlIO pr
             ⇒ Int
             → RegionT s pr (RegionalPtr α (RegionT s pr))
 mallocBytes size = wrapMalloc (FMA.mallocBytes size)
diff --git a/Foreign/Marshal/Array/Region.hs b/Foreign/Marshal/Array/Region.hs
--- a/Foreign/Marshal/Array/Region.hs
+++ b/Foreign/Marshal/Array/Region.hs
@@ -71,11 +71,9 @@
 -- from transformers:
 import Control.Monad.IO.Class                 ( MonadIO, liftIO )
 
--- from monad-control:
-import Control.Monad.IO.Control               ( MonadControlIO )
-
 -- from regions:
 import Control.Monad.Trans.Region             ( RegionT
+                                              , RegionControlIO
                                               , AncestorRegion
                                               , LocalRegion, Local
                                               )
@@ -104,19 +102,19 @@
 -- | Allocate storage for the given number of elements of a storable type.
 --
 -- Like 'malloc', but for multiple elements.
-mallocArray ∷ (Storable α, MonadControlIO pr)
+mallocArray ∷ (Storable α, RegionControlIO pr)
             ⇒ Int → RegionT s pr (RegionalPtr α (RegionT s pr))
 mallocArray = wrapMalloc ∘ FMA.mallocArray
 
 -- | Like 'mallocArray', but add an extra position to hold a special termination
 -- element.
-mallocArray0 ∷ (Storable α, MonadControlIO pr)
+mallocArray0 ∷ (Storable α, RegionControlIO pr)
              ⇒ Int → RegionT s pr (RegionalPtr α (RegionT s pr))
 mallocArray0 = wrapMalloc ∘ FMA.mallocArray0
 
 -- | Temporarily allocate space for the given number of elements (like 'alloca',
 -- but for multiple elements).
-allocaArray ∷ (Storable α, MonadControlIO pr)
+allocaArray ∷ (Storable α, RegionControlIO pr)
             ⇒ Int
             → (∀ sl. LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
             → RegionT s pr β
@@ -124,7 +122,7 @@
 
 -- | Like 'allocaArray', but add an extra position to hold a special termination
 -- element.
-allocaArray0 ∷ (Storable α, MonadControlIO pr)
+allocaArray0 ∷ (Storable α, RegionControlIO pr)
              ⇒ Int
              → (∀ sl. LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
              → RegionT s pr β
@@ -189,27 +187,27 @@
 -- sequence of storable values.
 --
 -- Like 'new', but for multiple elements.
-newArray ∷ (Storable α, MonadControlIO pr)
+newArray ∷ (Storable α, RegionControlIO pr)
          ⇒ [α] → RegionT s pr (RegionalPtr α (RegionT s pr ))
 newArray = wrapMalloc ∘ FMA.newArray
 
 -- | Write a list of storable elements into a newly allocated, consecutive
 -- sequence of storable values, where the end is fixed by the given end marker.
-newArray0 ∷ (Storable α, MonadControlIO pr)
+newArray0 ∷ (Storable α, RegionControlIO pr)
           ⇒ α → [α] → RegionT s pr (RegionalPtr α (RegionT s pr))
 newArray0 marker vals = wrapMalloc (FMA.newArray0 marker vals)
 
 -- | Temporarily store a list of storable values in memory.
 --
 -- Like 'with', but for multiple elements.
-withArray ∷ (Storable α, MonadControlIO pr)
+withArray ∷ (Storable α, RegionControlIO pr)
           ⇒ [α]
           → (∀ sl. LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
           → RegionT s pr β
 withArray = wrapAlloca ∘ FMA.withArray
 
 -- | Like 'withArray', but a terminator indicates where the array ends.
-withArray0 ∷ (Storable α, MonadControlIO pr)
+withArray0 ∷ (Storable α, RegionControlIO pr)
            ⇒ α
            → [α]
            → (∀ sl. LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
@@ -219,7 +217,7 @@
 -- | Like 'withArray', but the action gets the number of values as an additional
 -- parameter.
 withArrayLen ∷
-    (Storable α, MonadControlIO pr)
+    (Storable α, RegionControlIO pr)
   ⇒ [α]
   → (∀ sl. Int → LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
   → RegionT s pr β
@@ -227,7 +225,7 @@
 
 -- | Like 'withArrayLen', but a terminator indicates where the array ends.
 withArrayLen0 ∷
-    (Storable α, MonadControlIO pr)
+    (Storable α, RegionControlIO pr)
   ⇒ α
   → [α]
   → (∀ sl. Int → LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
diff --git a/Foreign/Marshal/Utils/Region.hs b/Foreign/Marshal/Utils/Region.hs
--- a/Foreign/Marshal/Utils/Region.hs
+++ b/Foreign/Marshal/Utils/Region.hs
@@ -70,11 +70,9 @@
 -- from transformers:
 import Control.Monad.IO.Class                 ( MonadIO, liftIO )
 
--- from monad-control:
-import Control.Monad.IO.Control               ( MonadControlIO )
-
 -- from regions:
 import Control.Monad.Trans.Region             ( RegionT
+                                              , RegionControlIO
                                               , AncestorRegion
                                               , RootRegion
                                               , LocalRegion, Local
@@ -105,7 +103,7 @@
 -- exception).
 --
 -- This provides a safer replacement for @Foreign.Marshal.Utils.'FMU.with'@.
-with ∷ (Storable α, MonadControlIO pr)
+with ∷ (Storable α, RegionControlIO pr)
      ⇒ α → (∀ sl. LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β) -- ^
      → RegionT s pr β
 with = wrapAlloca ∘ FMU.with
@@ -115,7 +113,7 @@
 -- 'sizeOf' method from the instance of 'Storable' for the appropriate type.
 --
 -- This provides a safer replacement for @Foreign.Marshal.Utils.'FMU.new'@.
-new ∷ (Storable α, MonadControlIO pr)
+new ∷ (Storable α, RegionControlIO pr)
     ⇒ α → RegionT s pr (RegionalPtr α (RegionT s pr))
 new = wrapMalloc ∘ FMU.new
 
diff --git a/Foreign/Ptr/Region/Internal.hs b/Foreign/Ptr/Region/Internal.hs
--- a/Foreign/Ptr/Region/Internal.hs
+++ b/Foreign/Ptr/Region/Internal.hs
@@ -77,6 +77,7 @@
 -- from regions:
 import Control.Monad.Trans.Region.OnExit ( FinalizerHandle, Finalizer, onExit )
 import Control.Monad.Trans.Region        ( RegionT
+                                         , RegionControlIO
                                          , AncestorRegion
                                          , RootRegion
                                          , LocalRegion, Local
@@ -88,9 +89,6 @@
                                          , unsafeLiftIOOp_
                                          )
 
--- from monad-control:
-import Control.Monad.IO.Control          ( MonadControlIO )
-
 #if MIN_VERSION_base(4,3,0)
 import Control.Exception         ( mask_ )
 #else
@@ -128,11 +126,11 @@
                   → RegionT s pr (RegionalPtr α (RegionT s pr))
 unsafeRegionalPtr ptr finalize = liftM (RegionalPtr ptr) (onExit finalize)
 
-wrapMalloc ∷ MonadControlIO pr
+wrapMalloc ∷ RegionControlIO pr
            ⇒ IO (Ptr α) → RegionT s pr (RegionalPtr α (RegionT s pr))
-wrapMalloc doMalloc = unsafeLiftIOOp_ mask_ $ do
-                        ptr ← liftIO doMalloc
-                        unsafeRegionalPtr ptr (free ptr)
+wrapMalloc doMalloc = unsafeControlIO $ \runInIO → mask_ $ do
+                        ptr ← doMalloc
+                        runInIO $ unsafeRegionalPtr ptr (free ptr)
 
 
 --------------------------------------------------------------------------------
@@ -167,14 +165,14 @@
 -- Note that a @LocalPtr@ can not be 'dup'licated to a parent region.
 newtype LocalPtr α (r ∷ * → *) = LocalPtr (Ptr α)
 
-wrapAlloca ∷ MonadControlIO pr
+wrapAlloca ∷ RegionControlIO pr
            ⇒ ((Ptr α → IO (RegionT s pr β)) → IO (RegionT s pr β))
            → (∀ sl. LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
            → RegionT s pr β
 wrapAlloca doAlloca f = unsafeLiftIOOp doAlloca $
                           unsafeStripLocal ∘ f ∘ LocalPtr
 
-wrapAlloca2 ∷ MonadControlIO pr
+wrapAlloca2 ∷ RegionControlIO pr
             ⇒ ((γ → Ptr α → IO (RegionT s pr β)) → IO (RegionT s pr β))
             → (∀ sl. γ → LocalPtr α (LocalRegion sl s) → RegionT (Local s) pr β)
             → RegionT s pr β
@@ -192,7 +190,7 @@
                   → (pointer α pr, Int) → cr String
 wrapPeekStringLen peekStringLen = liftIO ∘ peekStringLen ∘ first unsafePtr
 
-wrapNewStringLen ∷ MonadControlIO pr
+wrapNewStringLen ∷ RegionControlIO pr
                  ⇒ IO (Ptr α, Int)
                  → RegionT s pr (RegionalPtr α (RegionT s pr), Int)
 wrapNewStringLen newStringLen = unsafeLiftIOOp_ mask_ $ do
@@ -200,7 +198,7 @@
                                   rPtr ← unsafeRegionalPtr ptr (free ptr)
                                   return (rPtr, len)
 
-wrapWithStringLen ∷ MonadControlIO pr
+wrapWithStringLen ∷ RegionControlIO pr
                   ⇒ (((Ptr α, Int) → IO (RegionT s pr β)) → IO (RegionT s pr β))
                   → (∀ sl. (LocalPtr α (LocalRegion sl s), Int) → RegionT (Local s) pr β)
                   → RegionT s pr β
diff --git a/regional-pointers.cabal b/regional-pointers.cabal
--- a/regional-pointers.cabal
+++ b/regional-pointers.cabal
@@ -1,5 +1,5 @@
 name:          regional-pointers
-version:       0.6.0.1
+version:       0.7
 cabal-version: >=1.6
 build-type:    Custom
 license:       BSD3
@@ -40,9 +40,8 @@
   GHC-Options: -Wall
   build-depends: base                 >= 4     && < 4.5
                , base-unicode-symbols >= 0.1.1 && < 0.3
-               , regions              >= 0.10  && < 0.11
+               , regions              >= 0.11  && < 0.12
                , transformers         >= 0.2   && < 0.3
-               , monad-control        >= 0.2   && < 0.3
   exposed-modules: Foreign.Ptr.Region
                    Foreign.Ptr.Region.Unsafe
                    Foreign.Marshal.Alloc.Region
