diff --git a/System/IO/SaferFileHandles.hs b/System/IO/SaferFileHandles.hs
--- a/System/IO/SaferFileHandles.hs
+++ b/System/IO/SaferFileHandles.hs
@@ -2,6 +2,7 @@
            , NoImplicitPrelude
            , CPP
            , RankNTypes
+           , KindSignatures
   #-}
 
 -------------------------------------------------------------------------------
@@ -52,8 +53,9 @@
 -------------------------------------------------------------------------------
 
 module System.IO.SaferFileHandles
-    ( -- * Regional file handles
-      RegionalFileHandle
+    ( -- * File handles
+      FileHandle
+    , RegionalFileHandle
 
       -- ** IO Modes
       -- | Types that represent the IOMode an opened file can be in.
@@ -62,9 +64,11 @@
     , AppendMode
     , ReadWriteMode
 
+      -- *** Grouping the IOMode types.
     , ReadModes
     , WriteModes
 
+      -- *** A value-level IOMode.
     , IOMode(..)
     , MkIOMode(mkIOMode)
 
@@ -73,7 +77,7 @@
       for the majority of cases. In the rare occasion that you know these
       handles have different IOModes you can 'cast' them.
 
-      Note that these handles a pure values. This means they don't perform the
+      Note that these handles are pure values. This means they don't perform the
       side-effect of registering a finalizer like @hClose stdin@ in the
       'RegionT' monad.
 
@@ -81,6 +85,7 @@
       'RootRegion' which is the ancestor of any region. This allows the standard
       handles to be used in any region.
       -}
+    , StdFileHandle
     , stdin, stdout, stderr
     , cast
 
@@ -91,14 +96,10 @@
     , openFile', withFile'
 
       -- ** Regions
-      {-| Note that this module re-exports the @Control.Monad.Trans.Region@
-      module from the @regions@ package which allows you to:
-
-      * Run a region using 'runRegionT'.
-
-      * Concurrently run a region inside another region using 'forkIOTopRegion'.
-
-       * Duplicate a 'RegionalFileHandle' to a parent region using 'dup'.
+      {-|
+      Note that this module re-exports the @Control.Monad.Trans.Region@ module
+      from the @regions@ package which allows you to run regions using 'runRegionT'
+      and duplicate a 'RegionalFileHandle' to a parent region using 'dup'.
       -}
     , module Control.Monad.Trans.Region
 
@@ -244,18 +245,18 @@
 import Prelude           ( Integer )
 import Control.Monad     ( return, (>>=), liftM )
 import Data.Bool         ( Bool(..) )
-import Data.Function     ( ($), flip )
+import Data.Function     ( ($) )
 import Data.Functor      ( fmap )
 import Data.Char         ( Char, String )
 import Data.Int          ( Int )
-import Data.Maybe        ( Maybe(Nothing, Just) )
+import Data.Maybe        ( Maybe )
 import Text.Show         ( Show )
 import Text.Read         ( Read )
 import Foreign.Ptr       ( Ptr )
 
 import qualified System.IO as SIO
 
-#if __GLASGOW_HASKELL__ < 701
+#if __GLASGOW_HASKELL__ < 700
 import Control.Monad     ( fail )
 #endif
 
@@ -266,10 +267,6 @@
 -- from base-unicode-symbols:
 import Data.Function.Unicode ( (∘) )
 
--- from monad-peel:
-import Control.Monad.IO.Peel  ( MonadPeelIO )
-import Control.Exception.Peel ( block )
-
 -- from transformers:
 import Control.Monad.IO.Class ( MonadIO, liftIO )
 
@@ -327,44 +324,62 @@
                    )
 
 -- from regional-pointers:
-import Foreign.Ptr.Region        ( RegionalPtr )
+import Foreign.Ptr.Region        ( AllocatedPointer )
 import Foreign.Ptr.Region.Unsafe ( unsafePtr )
 
 -- from ourselves:
-import System.IO.SaferFileHandles.Internal ( RegionalFileHandle(RegionalFileHandle) )
+import System.IO.SaferFileHandles.Internal ( RegionalFileHandle(RegionalFileHandle)
+                                           , FileHandle
+                                           )
 import System.IO.SaferFileHandles.Unsafe   ( unsafeHandle
                                            , wrap, wrap2, wrap3
                                            , sanitizeIOError
                                            )
 
+-- from monad-control:
+import Control.Monad.IO.Control  ( MonadControlIO )
 
+#if MIN_VERSION_base(4,3,0)
+import Control.Exception.Control ( mask_ )
+#else
+import Control.Exception.Control ( block )
+
+mask_ ∷ MonadControlIO m ⇒ m a → m a
+mask_ = block
+#endif
+
+
 -------------------------------------------------------------------------------
 -- ** Standard handles
 -------------------------------------------------------------------------------
 
+newtype StdFileHandle ioMode (r ∷ * → *) = StdFileHandle (Handle ioMode)
+
+instance FileHandle StdFileHandle where
+    unsafeHandle (StdFileHandle handle) = handle
+
 -- | Wraps: @System.IO.'SIO.stdin'@.
-stdin ∷ RegionalFileHandle ReadMode RootRegion
-stdin = RegionalFileHandle E.stdin Nothing
+stdin ∷ StdFileHandle ReadMode RootRegion
+stdin = StdFileHandle E.stdin
 
 -- | Wraps: @System.IO.'SIO.stdout'@.
-stdout ∷ RegionalFileHandle WriteMode RootRegion
-stdout = RegionalFileHandle E.stdout Nothing
+stdout ∷ StdFileHandle WriteMode RootRegion
+stdout = StdFileHandle E.stdout
 
 -- | Wraps: @System.IO.'SIO.stderr'@.
-stderr ∷ RegionalFileHandle WriteMode RootRegion
-stderr = RegionalFileHandle E.stderr Nothing
+stderr ∷ StdFileHandle WriteMode RootRegion
+stderr = StdFileHandle E.stderr
 
 {-| Cast the IOMode of a handle if the handle supports it.
 
-This function is primarily used in combination with the standard handles. When
-you know the IOMode of a handle is different from its default IOMode you can
-cast it to the right one.
+This function is used in combination with the standard handles.
+When you know the IOMode of a handle is different from its default IOMode you
+can cast it to the right one.
 -}
 cast ∷ (pr `AncestorRegion` cr, MonadIO cr, CheckMode castedIOMode)
-     ⇒ RegionalFileHandle anyIOMode pr
-     → cr (Maybe (RegionalFileHandle castedIOMode pr))
-cast (RegionalFileHandle h mbCloseHndl) =
-    (liftM ∘ fmap) (flip RegionalFileHandle mbCloseHndl) $ liftIO $ E.cast h
+     ⇒ StdFileHandle anyIOMode pr
+     → cr (Maybe (StdFileHandle castedIOMode pr))
+cast = (liftM ∘ fmap) StdFileHandle ∘ liftIO ∘ E.cast ∘ unsafeHandle
 
 
 -------------------------------------------------------------------------------
@@ -409,30 +424,30 @@
 Note: if you will be working with files containing binary data, you'll want to
 be using 'openBinaryFile'.
 -}
-openFile ∷ (MonadPeelIO pr, AbsRelClass ar)
+openFile ∷ (MonadControlIO pr, AbsRelClass ar)
          ⇒ FilePath ar
          → IOMode ioMode
          → RegionT s pr
              (RegionalFileHandle ioMode (RegionT s pr))
 openFile = openNormal E.openFile
 
-openNormal ∷ (MonadPeelIO pr, AbsRelClass ar)
+openNormal ∷ (MonadControlIO pr, AbsRelClass ar)
            ⇒ (E.FilePath → IOMode ioMode → IO (E.Handle ioMode))
            → ( FilePath ar
              → IOMode ioMode
              → RegionT s pr
                  (RegionalFileHandle ioMode (RegionT s pr))
              )
-openNormal open = \filePath ioMode → block $ do
+openNormal open = \filePath ioMode → mask_ $ do
   h ← liftIO $ open (getPathString filePath) ioMode
   ch ← onExit $ sanitizeIOError $ hClose h
-  return $ RegionalFileHandle h $ Just ch
+  return $ RegionalFileHandle h ch
 
 {-| Convenience function which opens a file, applies the given continuation
 function to the resulting regional file handle and runs the resulting
 region. This provides a safer safer replacement for @System.IO.'SIO.withFile'@.
 -}
-withFile ∷ (MonadPeelIO pr, AbsRelClass ar)
+withFile ∷ (MonadControlIO pr, AbsRelClass ar)
          ⇒ FilePath ar
          → IOMode ioMode
          → (∀ s. RegionalFileHandle ioMode (RegionT s pr) → RegionT s pr α)
@@ -445,14 +460,14 @@
 -- inferred from the type of the resulting 'RegionalFileHandle'.
 --
 -- Note that: @openFile' fp = 'openFile' fp 'mkIOMode'@.
-openFile' ∷ (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode)
+openFile' ∷ (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode)
           ⇒ FilePath ar
           → RegionT s pr
               (RegionalFileHandle ioMode (RegionT s pr))
 openFile' filePath = openFile filePath mkIOMode
 
 -- | Note that: @withFile' filePath = 'withFile' filePath 'mkIOMode'@.
-withFile' ∷ (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode)
+withFile' ∷ (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode)
           ⇒ FilePath ar
           → (∀ s. RegionalFileHandle ioMode (RegionT s pr) → RegionT s pr α)
           → pr α
@@ -469,8 +484,8 @@
 -- 'hFileSize' @hdl@ returns the size of that file in 8-bit bytes.
 --
 -- Wraps: @System.IO.'SIO.hFileSize'@.
-hFileSize ∷ (pr `AncestorRegion` cr, MonadIO cr)
-          ⇒ RegionalFileHandle ioMode pr → cr Integer
+hFileSize ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+          ⇒ handle ioMode pr → cr Integer
 hFileSize = wrap E.hFileSize
 
 #ifdef __GLASGOW_HASKELL__
@@ -478,8 +493,8 @@
 -- to @size@ bytes.
 --
 -- Wraps: @System.IO.'SIO.hSetFileSize'@.
-hSetFileSize ∷ (pr `AncestorRegion` cr, MonadIO cr)
-             ⇒ RegionalFileHandle ioMode pr → Integer → cr ()
+hSetFileSize ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+             ⇒ handle ioMode pr → Integer → cr ()
 hSetFileSize = wrap2 E.hSetFileSize
 #endif
 
@@ -495,13 +510,13 @@
 -- 'hLookAhead' and checking for an EOF exception.
 --
 -- Wraps: @System.IO.'SIO.hIsEOF'@.
-hIsEOF ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
-       ⇒ RegionalFileHandle ioMode pr → cr Bool
+hIsEOF ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
+       ⇒ handle ioMode pr → cr Bool
 hIsEOF = wrap E.hIsEOF
 
 -- | Generalizes: @System.IO.'SIO.isEOF'@ to any 'MonadIO'.
 isEOF ∷ MonadIO m ⇒ m Bool
-isEOF = liftIO $ E.isEOF
+isEOF = liftIO E.isEOF
 
 
 -- ** Buffering operations
@@ -523,16 +538,16 @@
 --    to be changed.
 --
 -- Wraps: @System.IO.'SIO.hSetBuffering'@.
-hSetBuffering ∷ (pr `AncestorRegion` cr, MonadIO cr)
-              ⇒ RegionalFileHandle ioMode pr → BufferMode → cr ()
+hSetBuffering ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+              ⇒ handle ioMode pr → BufferMode → cr ()
 hSetBuffering = wrap2 E.hSetBuffering
 
 -- | Computation 'hGetBuffering' @hdl@ returns the current buffering mode for
 -- @hdl@.
 --
 -- Wraps: @System.IO.'SIO.hGetBuffering'@.
-hGetBuffering ∷ (pr `AncestorRegion` cr, MonadIO cr)
-              ⇒ RegionalFileHandle ioMode pr → cr BufferMode
+hGetBuffering ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+              ⇒ handle ioMode pr → cr BufferMode
 hGetBuffering = wrap E.hGetBuffering
 
 -- | The action 'hFlush' @hdl@ causes any items buffered for output in handle
@@ -547,8 +562,8 @@
 --  under these circumstances.
 --
 -- Wraps: @System.IO.'SIO.hFlush'@.
-hFlush ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)
-       ⇒ RegionalFileHandle ioMode pr → cr ()
+hFlush ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)
+       ⇒ handle ioMode pr → cr ()
 hFlush = wrap E.hFlush
 
 
@@ -558,8 +573,8 @@
 -- a value of the abstract type 'HandlePosn'.
 --
 -- Wraps: @System.IO.'SIO.hGetPosn'@.
-hGetPosn ∷ (pr `AncestorRegion` cr, MonadIO cr)
-         ⇒ RegionalFileHandle ioMode pr → cr HandlePosn
+hGetPosn ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+         ⇒ handle ioMode pr → cr HandlePosn
 hGetPosn = wrap E.hGetPosn
 
 -- | If a call to 'hGetPosn' @hdl@ returns a position @p@, then computation
@@ -592,14 +607,14 @@
 --  * 'isPermissionError' if a system resource limit would be exceeded.
 --
 -- Wraps: @System.IO.'SIO.hSeek'@.
-hSeek ∷ (pr `AncestorRegion` cr, MonadIO cr)
-      ⇒ RegionalFileHandle ioMode pr → SeekMode → Integer → cr ()
+hSeek ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+      ⇒ handle ioMode pr → SeekMode → Integer → cr ()
 hSeek = wrap3 E.hSeek
 
 #if !defined(__NHC__)
 -- | Wraps: @System.IO.'SIO.hTell'@.
-hTell ∷ (pr `AncestorRegion` cr, MonadIO cr)
-      ⇒ RegionalFileHandle ioMode pr → cr Integer
+hTell ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+      ⇒ handle ioMode pr → cr Integer
 hTell = wrap E.hTell
 #endif
 
@@ -611,8 +626,8 @@
 -- for testing the correctness of this library.
 --
 -- Wraps: @System.IO.'SIO.hIsOpen'@.
-hIsOpen ∷ (pr `AncestorRegion` cr, MonadIO cr)
-         ⇒ RegionalFileHandle ioMode pr → cr Bool
+hIsOpen ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+         ⇒ handle ioMode pr → cr Bool
 hIsOpen = wrap E.hIsOpen
 
 -- | Note that this operation should always return 'False' since the @regions@
@@ -620,8 +635,8 @@
 -- for testing the correctness of this library.
 --
 -- Wraps: @System.IO.'SIO.hIsClosed'@.
-hIsClosed ∷ (pr `AncestorRegion` cr, MonadIO cr)
-           ⇒ RegionalFileHandle ioMode pr → cr Bool
+hIsClosed ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+           ⇒ handle ioMode pr → cr Bool
 hIsClosed = wrap E.hIsClosed
 
 -- | Note that this operation should always return 'True' for IOModes which have
@@ -629,8 +644,8 @@
 -- correctness of this library.
 --
 -- Wraps: @System.IO.'SIO.hIsReadable'@.
-hIsReadable ∷ (pr `AncestorRegion` cr, MonadIO cr)
-            ⇒ RegionalFileHandle ioMode pr → cr Bool
+hIsReadable ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+            ⇒ handle ioMode pr → cr Bool
 hIsReadable = wrap E.hIsReadable
 
 -- | Note that this operation should always return 'True' for IOModes which have
@@ -638,13 +653,13 @@
 -- correctness of this library.
 --
 -- Wraps: @System.IO.'SIO.hIsWritable'@.
-hIsWritable ∷ (pr `AncestorRegion` cr, MonadIO cr)
-            ⇒ RegionalFileHandle ioMode pr → cr Bool
+hIsWritable ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+            ⇒ handle ioMode pr → cr Bool
 hIsWritable = wrap E.hIsWritable
 
 -- | Wraps: @System.IO.'SIO.hIsSeekable'@.
-hIsSeekable ∷ (pr `AncestorRegion` cr, MonadIO cr)
-            ⇒ RegionalFileHandle ioMode pr → cr Bool
+hIsSeekable ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+            ⇒ handle ioMode pr → cr Bool
 hIsSeekable = wrap E.hIsSeekable
 
 
@@ -654,22 +669,22 @@
 -- | Is the handle connected to a terminal?
 --
 -- Wraps: @System.IO.'SIO.hIsTerminalDevice'@.
-hIsTerminalDevice ∷ (pr `AncestorRegion` cr, MonadIO cr)
-                  ⇒ RegionalFileHandle ioMode pr → cr Bool
+hIsTerminalDevice ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+                  ⇒ handle ioMode pr → cr Bool
 hIsTerminalDevice = wrap E.hIsTerminalDevice
 
 -- | Set the echoing status of a handle connected to a terminal.
 --
 -- Wraps: @System.IO.'SIO.hSetEcho'@.
-hSetEcho ∷ (pr `AncestorRegion` cr, MonadIO cr)
-         ⇒ RegionalFileHandle ioMode pr → Bool → cr ()
+hSetEcho ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+         ⇒ handle ioMode pr → Bool → cr ()
 hSetEcho = wrap2 E.hSetEcho
 
 -- | Get the echoing status of a handle connected to a terminal.
 --
 -- Wraps: @System.IO.'SIO.hGetEcho'@.
-hGetEcho ∷ (pr `AncestorRegion` cr, MonadIO cr)
-         ⇒ RegionalFileHandle ioMode pr → cr Bool
+hGetEcho ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+         ⇒ handle ioMode pr → cr Bool
 hGetEcho = wrap E.hGetEcho
 #endif
 
@@ -678,8 +693,8 @@
 
 #ifdef __GLASGOW_HASKELL__
 -- | Wraps: @System.IO.'SIO.hShow'@.
-hShow ∷ (pr `AncestorRegion` cr, MonadIO cr)
-      ⇒ RegionalFileHandle ioMode pr → cr String
+hShow ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+      ⇒ handle ioMode pr → cr String
 hShow = wrap E.hShow
 #endif
 
@@ -707,8 +722,8 @@
 -- @safe@ foreign call in this respect.
 --
 -- Wraps: @System.IO.'SIO.hWaitForInput'@.
-hWaitForInput ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
-              ⇒ RegionalFileHandle ioMode pr → Int → cr Bool
+hWaitForInput ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
+              ⇒ handle ioMode pr → Int → cr Bool
 hWaitForInput = wrap2 E.hWaitForInput
 
 -- | Computation 'hReady' @hdl@ indicates whether at least one item is
@@ -719,8 +734,8 @@
 --  * 'isEOFError' if the end of file has been reached.
 --
 -- Wraps: @System.IO.'SIO.hReady'@.
-hReady ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
-       ⇒ RegionalFileHandle ioMode pr → cr Bool
+hReady ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
+       ⇒ handle ioMode pr → cr Bool
 hReady = wrap E.hReady
 
 -- | Computation 'hGetChar' @hdl@ reads a character from the file or
@@ -731,8 +746,8 @@
 --  * 'isEOFError' if the end of file has been reached.
 --
 -- Wraps: @System.IO.'SIO.hGetChar'@.
-hGetChar ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
-         ⇒ RegionalFileHandle ioMode pr → cr Char
+hGetChar ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
+         ⇒ handle ioMode pr → cr Char
 hGetChar = wrap E.hGetChar
 
 -- | Computation 'hGetLine' @hdl@ reads a line from the file or
@@ -748,8 +763,8 @@
 -- line is returned.
 --
 -- Wraps: @System.IO.'SIO.hGetLine'@.
-hGetLine ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
-         ⇒ RegionalFileHandle ioMode pr → cr String
+hGetLine ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
+         ⇒ handle ioMode pr → cr String
 hGetLine = wrap E.hGetLine
 
 -- | Computation 'hLookAhead' returns the next character from the handle
@@ -761,8 +776,8 @@
 --  * 'isEOFError' if the end of file has been reached.
 --
 -- Wraps: @System.IO.'SIO.hLookAhead'@.
-hLookAhead ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
-           ⇒ RegionalFileHandle ioMode pr → cr Char
+hLookAhead ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
+           ⇒ handle ioMode pr → cr Char
 hLookAhead = wrap E.hLookAhead
 
 -- | Computation 'hGetContents' @hdl@ returns the list of characters
@@ -795,8 +810,8 @@
 --  * 'isEOFError' if the end of file has been reached.
 --
 -- Wraps: @System.IO.'SIO.hGetContents'@.
-hGetContents ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
-             ⇒ RegionalFileHandle ioMode pr → cr String
+hGetContents ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)
+             ⇒ handle ioMode pr → cr String
 hGetContents = wrap E.hGetContents
 
 
@@ -813,8 +828,8 @@
 --  * 'isPermissionError' if another system resource limit would be exceeded.
 --
 -- Wraps: @System.IO.'SIO.hPutChar'@.
-hPutChar ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)
-         ⇒ RegionalFileHandle ioMode pr → Char → cr ()
+hPutChar ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)
+         ⇒ handle ioMode pr → Char → cr ()
 hPutChar = wrap2 E.hPutChar
 
 -- | Computation 'hPutStr' @hdl s@ writes the string
@@ -827,15 +842,15 @@
 --  * 'isPermissionError' if another system resource limit would be exceeded.
 --
 -- Wraps: @System.IO.'SIO.hPutStr'@.
-hPutStr ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)
-        ⇒ RegionalFileHandle ioMode pr → String → cr ()
+hPutStr ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)
+        ⇒ handle ioMode pr → String → cr ()
 hPutStr = wrap2 E.hPutStr
 
 -- | The same as 'hPutStr', but adds a newline character.
 --
 -- Wraps: @System.IO.'SIO.hPutStrLn'@.
-hPutStrLn ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)
-          ⇒ RegionalFileHandle ioMode pr → String → cr ()
+hPutStrLn ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)
+          ⇒ handle ioMode pr → String → cr ()
 hPutStrLn = wrap2 E.hPutStrLn
 
 -- | Computation 'hPrint' @hdl t@ writes the string representation of @t@
@@ -849,8 +864,8 @@
 --  * 'isPermissionError' if another system resource limit would be exceeded.
 --
 -- Wraps: @System.IO.'SIO.hPrint'@.
-hPrint ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode, Show α)
-       ⇒ RegionalFileHandle ioMode pr → α → cr ()
+hPrint ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode, Show α)
+       ⇒ handle ioMode pr → α → cr ()
 hPrint = wrap2 E.hPrint
 
 
@@ -911,7 +926,7 @@
 -- characters.  (See also 'hSetBinaryMode'.)
 --
 -- This provides a safer replacement for @System.IO.'SIO.openBinaryFile'@.
-openBinaryFile ∷ (MonadPeelIO pr, AbsRelClass ar)
+openBinaryFile ∷ (MonadControlIO pr, AbsRelClass ar)
                ⇒ FilePath ar
                → IOMode ioMode
                → RegionT s pr
@@ -923,7 +938,7 @@
 resulting region. This provides a safer replacement for
 @System.IO.'SIO.withBinaryFile'@.
 -}
-withBinaryFile ∷ (MonadPeelIO pr, AbsRelClass ar)
+withBinaryFile ∷ (MonadControlIO pr, AbsRelClass ar)
                ⇒ FilePath ar
                → IOMode ioMode
                →  (∀ s. RegionalFileHandle ioMode (RegionT s pr) → RegionT s pr α)
@@ -933,14 +948,14 @@
 -- ** Opening binary files by inferring the IOMode
 
 -- | Note that: @openBinaryFile' filePath = 'openBinaryFile' filePath 'mkIOMode'@.
-openBinaryFile' ∷ (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode)
+openBinaryFile' ∷ (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode)
                 ⇒ FilePath ar
                 → RegionT s pr
                     (RegionalFileHandle ioMode (RegionT s pr))
 openBinaryFile' filePath = openBinaryFile filePath mkIOMode
 
 -- | Note that: @withBinaryFile' filePath = 'withBinaryFile' filePath 'mkIOMode'@.
-withBinaryFile' ∷ (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode)
+withBinaryFile' ∷ (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode)
                 ⇒ FilePath ar
                 →  (∀ s. RegionalFileHandle ioMode (RegionT s pr) → RegionT s pr α)
                 → pr α
@@ -955,18 +970,18 @@
 -- with 'hSetNewlineMode' with 'noNewlineTranslation'.
 --
 -- Wraps: @System.IO.'SIO.hSetBinaryMode'@.
-hSetBinaryMode ∷ (pr `AncestorRegion` cr, MonadIO cr)
-               ⇒ RegionalFileHandle ioMode pr → Bool → cr ()
+hSetBinaryMode ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+               ⇒ handle ioMode pr → Bool → cr ()
 hSetBinaryMode = wrap2 E.hSetBinaryMode
 
 -- | 'hPutBuf' @hdl buf count@ writes @count@ 8-bit bytes from the
 -- buffer @buf@ to the handle @hdl@.  It returns ().
 --
--- 'hPutBuf' ignores any text encoding that applies to the 'RegionalFileHandle',
+-- 'hPutBuf' ignores any text encoding that applies to the handle,
 -- writing the bytes directly to the underlying file or device.
 --
 -- 'hPutBuf' ignores the prevailing 'TextEncoding' and
--- 'NewlineMode' on the 'RegionalFileHandle', and writes bytes directly.
+-- 'NewlineMode' on the handle, and writes bytes directly.
 --
 -- This operation may fail with:
 --
@@ -978,19 +993,24 @@
 -- Wraps: @System.IO.'SIO.hPutBuf'@.
 hPutBuf ∷ ( pr1 `AncestorRegion` cr
           , pr2 `AncestorRegion` cr
+          , FileHandle       handle
+          , AllocatedPointer pointer
           , MonadIO cr
           , WriteModes ioMode
           )
-        ⇒ RegionalFileHandle ioMode pr1
-        → RegionalPtr α pr2
+        ⇒ handle ioMode pr1
+        → pointer α pr2
         → Int
         → cr ()
 hPutBuf = wrapPtr E.hPutBuf
 
-wrapPtr ∷ MonadIO cr
+wrapPtr ∷ ∀ (handle  ∷ * → (* → *) → *) ioMode (pr1 ∷ * → *)
+            (pointer ∷ * → (* → *) → *) α      (pr2 ∷ * → *)
+            cr β
+        . (FileHandle handle, AllocatedPointer pointer, MonadIO cr)
         ⇒ (Handle ioMode → Ptr α → Int → IO β)
-        → (RegionalFileHandle ioMode pr1 → RegionalPtr α pr2 → Int → cr β)
-wrapPtr f = \h rPtr → liftIO ∘ f (unsafeHandle h) (unsafePtr rPtr)
+        → (handle ioMode pr1 → pointer α pr2 → Int → cr β)
+wrapPtr f = \h pointer → liftIO ∘ f (unsafeHandle h) (unsafePtr pointer)
 
 -- | 'hGetBuf' @hdl buf count@ reads data from the handle @hdl@
 -- into the buffer @buf@ until either EOF is reached or
@@ -998,7 +1018,7 @@
 -- It returns the number of bytes actually read.  This may be zero if
 -- EOF was reached before any data was read (or if @count@ is zero).
 --
--- 'hGetBuf' ignores whatever 'TextEncoding' the 'RegionalFileHandle' is
+-- 'hGetBuf' ignores whatever 'TextEncoding' the handle is
 -- currently using, and reads bytes directly from the underlying IO device.
 --
 -- 'hGetBuf' never raises an EOF exception, instead it returns a value
@@ -1008,16 +1028,18 @@
 -- is closed, 'hGetBuf' will behave as if EOF was reached.
 --
 -- 'hGetBuf' ignores the prevailing 'TextEncoding' and 'NewlineMode' on the
--- 'RegionalFileHandle', and reads bytes directly.
+-- handle, and reads bytes directly.
 --
 -- Wraps: @System.IO.'SIO.hGetBuf'@.
 hGetBuf ∷ ( pr1 `AncestorRegion` cr
           , pr2 `AncestorRegion` cr
+          , FileHandle       handle
+          , AllocatedPointer pointer
           , MonadIO cr
           , ReadModes ioMode
           )
-        ⇒ RegionalFileHandle ioMode pr1
-        → RegionalPtr α pr2
+        ⇒ handle ioMode pr1
+        → pointer α pr2
         → Int
         → cr Int
 hGetBuf = wrapPtr E.hGetBuf
@@ -1040,16 +1062,18 @@
 -- is closed, 'hGetBufSome' will behave as if EOF was reached.
 --
 -- 'hGetBufSome' ignores the prevailing 'TextEncoding' and 'NewlineMode'
--- on the 'Handle', and reads bytes directly.
+-- on the handle, and reads bytes directly.
 --
 -- Wraps: @System.IO.'SIO.hGetBufSome'@.
 hGetBufSome ∷ ( pr1 `AncestorRegion` cr
               , pr2 `AncestorRegion` cr
+              , FileHandle       handle
+              , AllocatedPointer pointer
               , MonadIO cr
               , ReadModes ioMode
               )
-            ⇒ RegionalFileHandle ioMode pr1
-            → RegionalPtr α pr2
+            ⇒ handle ioMode pr1
+            → pointer α pr2
             → Int
             → cr Int
 hGetBufSome = wrapPtr E.hGetBufSome
@@ -1058,11 +1082,13 @@
 -- | Wraps: @System.IO.'SIO.hPutBufNonBlocking'@.
 hPutBufNonBlocking ∷ ( pr1 `AncestorRegion` cr
                      , pr2 `AncestorRegion` cr
+                     , FileHandle       handle
+                     , AllocatedPointer pointer
                      , MonadIO cr
                      , WriteModes ioMode
                      )
-                   ⇒ RegionalFileHandle ioMode pr1
-                   → RegionalPtr α pr2
+                   ⇒ handle ioMode pr1
+                   → pointer α pr2
                    → Int
                    → cr Int
 hPutBufNonBlocking = wrapPtr E.hPutBufNonBlocking
@@ -1077,23 +1103,25 @@
 -- only whatever data is available.  To wait for data to arrive before
 -- calling 'hGetBufNonBlocking', use 'hWaitForInput'.
 --
--- 'hGetBufNonBlocking' ignores whatever 'TextEncoding' the 'RegionalFileHandle'
+-- 'hGetBufNonBlocking' ignores whatever 'TextEncoding' the handle
 -- is currently using, and reads bytes directly from the underlying IO device.
 --
 -- If the handle is a pipe or socket, and the writing end
 -- is closed, 'hGetBufNonBlocking' will behave as if EOF was reached.
 --
 -- 'hGetBufNonBlocking' ignores the prevailing 'TextEncoding' and 'NewlineMode'
--- on the 'RegionalFileHandle', and reads bytes directly.
+-- on the handle, and reads bytes directly.
 --
 -- Wraps: @System.IO.'SIO.hGetBufNonBlocking'@.
 hGetBufNonBlocking ∷ ( pr1 `AncestorRegion` cr
                      , pr2 `AncestorRegion` cr
+                     , FileHandle       handle
+                     , AllocatedPointer pointer
                      , MonadIO cr
                      , ReadModes ioMode
                      )
-                   ⇒ RegionalFileHandle ioMode pr1
-                   → RegionalPtr α pr2
+                   ⇒ handle ioMode pr1
+                   → pointer α pr2
                    → Int
                    → cr Int
 hGetBufNonBlocking = wrapPtr E.hGetBufNonBlocking
@@ -1110,7 +1138,7 @@
 -- where XXX is some random number.
 type Template = RelFile
 
-openTemp ∷ (MonadPeelIO pr, AbsRelClass ar)
+openTemp ∷ (MonadControlIO pr, AbsRelClass ar)
          ⇒ (E.FilePath → String → IO (E.FilePath, E.Handle ReadWriteMode))
          → ( DirPath ar
            → Template
@@ -1118,10 +1146,10 @@
                           , RegionalFileHandle ReadWriteMode (RegionT s pr)
                           )
            )
-openTemp open = \dirPath template → block $ do
+openTemp open = \dirPath template → mask_ $ do
   (fp, h) ← liftIO $ open (getPathString dirPath) (getPathString template)
   ch ← onExit $ sanitizeIOError $ hClose h
-  return (asAbsFile fp, RegionalFileHandle h $ Just ch)
+  return (asAbsFile fp, RegionalFileHandle h ch)
 
 -- | The function creates a temporary file in 'ReadWriteMode'. The created file
 -- isn\'t deleted automatically, so you need to delete it manually.
@@ -1138,7 +1166,7 @@
 -- so if you rely on this behaviour it is best to use local filesystems only.
 --
 -- This provides a safer replacement for @System.IO.'SIO.openTempFile'@.
-openTempFile ∷ (MonadPeelIO pr, AbsRelClass ar)
+openTempFile ∷ (MonadControlIO pr, AbsRelClass ar)
              ⇒ DirPath ar -- ^ Directory in which to create the file.
              → Template   -- ^ File name template.
              → RegionT s pr ( AbsFile
@@ -1151,7 +1179,7 @@
 --
 -- This provides a safer replacement for @System.IO.'SIO.openBinaryTempFile'@.
 openBinaryTempFile ∷
-    (MonadPeelIO pr, AbsRelClass ar)
+    (MonadControlIO pr, AbsRelClass ar)
   ⇒ DirPath ar
   → Template
   → RegionT s pr ( AbsFile
@@ -1165,7 +1193,7 @@
 -- This provides a safer replacement for
 -- @System.IO.'SIO.openTempFileWithDefaultPermissions'@.
 openTempFileWithDefaultPermissions ∷
-    (MonadPeelIO pr, AbsRelClass ar)
+    (MonadControlIO pr, AbsRelClass ar)
   ⇒ DirPath ar
   → Template
   → RegionT s pr ( AbsFile
@@ -1178,7 +1206,7 @@
 -- This provides a safer replacement for
 -- @System.IO.'SIO.openBinaryTempFileWithDefaultPermissions'@.
 openBinaryTempFileWithDefaultPermissions ∷
-    (MonadPeelIO pr, AbsRelClass ar)
+    (MonadControlIO pr, AbsRelClass ar)
   ⇒ DirPath ar
   → Template
   → RegionT s pr ( AbsFile
@@ -1195,33 +1223,33 @@
 
 -- | The action 'hSetEncoding' @hdl@ @encoding@ changes the text encoding for
 -- the handle @hdl@ to @encoding@.  The default encoding when a
--- 'RegionalFileHandle' is created is 'localeEncoding', namely the default
+-- handle is created is 'localeEncoding', namely the default
 -- encoding for the current locale.
 --
--- To create a 'RegionalFileHandle' with no encoding at all, use
+-- To create a handle with no encoding at all, use
 -- 'openBinaryFile'. To stop further encoding or decoding on an existing
--- 'RegionalFileHandle', use 'hSetBinaryMode'.
+-- handle, use 'hSetBinaryMode'.
 --
 -- 'hSetEncoding' may need to flush buffered data in order to change
 -- the encoding.
 --
 -- Wraps: @System.IO.'SIO.hSetEncoding'@.
-hSetEncoding ∷ (pr `AncestorRegion` cr, MonadIO cr)
-             ⇒ RegionalFileHandle ioMode pr → TextEncoding → cr ()
+hSetEncoding ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+             ⇒ handle ioMode pr → TextEncoding → cr ()
 hSetEncoding = wrap2 E.hSetEncoding
 
--- | Return the current 'TextEncoding' for the specified 'RegionalFileHandle',
--- or 'Nothing' if the 'Handle' is in binary mode.
+-- | Return the current 'TextEncoding' for the specified handle,
+-- or 'Nothing' if the handle is in binary mode.
 --
 -- Note that the 'TextEncoding' remembers nothing about the state of the
--- encoder/decoder in use on this 'RegionalFileHandle'. For example, if the
+-- encoder/decoder in use on this handle. For example, if the
 -- encoding in use is UTF-16, then using 'hGetEncoding' and 'hSetEncoding' to
 -- save and restore the encoding may result in an extra byte-order-mark being
 -- written to the file.
 --
 -- Wraps: @System.IO.'SIO.hGetEncoding'@.
-hGetEncoding ∷ (pr `AncestorRegion` cr, MonadIO cr)
-             ⇒ RegionalFileHandle ioMode pr → cr (Maybe TextEncoding)
+hGetEncoding ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+             ⇒ handle ioMode pr → cr (Maybe TextEncoding)
 hGetEncoding = wrap E.hGetEncoding
 
 -- | Generalizes @System.IO.'SIO.mkTextEncoding'@ to any 'MonadIO'.
@@ -1233,12 +1261,13 @@
 -- * Newline conversion
 --------------------------------------------------------------------------------
 
--- | Set the 'NewlineMode' on the specified 'RegionalFileHandle'. All buffered
--- data is flushed first.
+-- | Set the 'NewlineMode' on the specified handle.
 --
+-- All buffered data is flushed first.
+--
 -- Wraps: @System.IO.'SIO.hSetNewlineMode'@.
-hSetNewlineMode ∷ (pr `AncestorRegion` cr, MonadIO cr)
-                ⇒ RegionalFileHandle ioMode pr → NewlineMode → cr ()
+hSetNewlineMode ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)
+                ⇒ handle ioMode pr → NewlineMode → cr ()
 hSetNewlineMode = wrap2 E.hSetNewlineMode
 #endif
 
diff --git a/System/IO/SaferFileHandles/Internal.hs b/System/IO/SaferFileHandles/Internal.hs
--- a/System/IO/SaferFileHandles/Internal.hs
+++ b/System/IO/SaferFileHandles/Internal.hs
@@ -14,7 +14,9 @@
 --------------------------------------------------------------------------------
 
 module System.IO.SaferFileHandles.Internal
-    ( RegionalFileHandle(RegionalFileHandle) ) where
+    ( RegionalFileHandle(RegionalFileHandle)
+    , FileHandle(unsafeHandle)
+    ) where
 
 
 --------------------------------------------------------------------------------
@@ -22,12 +24,7 @@
 --------------------------------------------------------------------------------
 
 -- from base:
-import Control.Monad                     ( return, liftM )
-import Data.Function                     ( ($) )
-import Data.Maybe                        ( Maybe(Nothing, Just) )
-
--- from base-unicode-symbols:
-import Data.Function.Unicode             ( (∘) )
+import Control.Monad                     ( liftM )
 
 -- from regions:
 import Control.Monad.Trans.Region        ( Dup(dup) )
@@ -48,11 +45,16 @@
 -- | A regional handle to an opened file parameterized by the 'IOMode' in which
 -- you opened the file and the region in which it was created.
 data RegionalFileHandle ioMode (r ∷ * → *) =
-    RegionalFileHandle !(Handle ioMode) !(Maybe (FinalizerHandle r))
+    RegionalFileHandle !(Handle ioMode) !(FinalizerHandle r)
 
 instance Dup (RegionalFileHandle ioMode) where
-    dup (RegionalFileHandle h Nothing)   = return $ RegionalFileHandle h Nothing
-    dup (RegionalFileHandle h (Just ch)) = liftM (RegionalFileHandle h ∘ Just) $ dup ch
+    dup (RegionalFileHandle h ch) = liftM (RegionalFileHandle h) (dup ch)
+
+class FileHandle (handle ∷ * → (* → *) → *) where
+    unsafeHandle ∷ handle ioMode r → Handle ioMode
+
+instance FileHandle RegionalFileHandle where
+    unsafeHandle (RegionalFileHandle handle _) = handle
 
 
 -- The End ---------------------------------------------------------------------
diff --git a/System/IO/SaferFileHandles/Unsafe.hs b/System/IO/SaferFileHandles/Unsafe.hs
--- a/System/IO/SaferFileHandles/Unsafe.hs
+++ b/System/IO/SaferFileHandles/Unsafe.hs
@@ -38,29 +38,26 @@
 import System.IO.ExplicitIOModes         ( Handle, IO )
 
 -- from ourselves:
-import System.IO.SaferFileHandles.Internal ( RegionalFileHandle(RegionalFileHandle) )
+import System.IO.SaferFileHandles.Internal ( FileHandle, unsafeHandle )
 
 
 --------------------------------------------------------------------------------
 -- Getting the actual @Handle@
 --------------------------------------------------------------------------------
 
-unsafeHandle ∷ RegionalFileHandle ioMode r → Handle ioMode
-unsafeHandle (RegionalFileHandle h _) = h
-
-wrap ∷ MonadIO m
+wrap ∷ (FileHandle handle, MonadIO m)
      ⇒ (Handle ioMode → IO α)
-     → (RegionalFileHandle ioMode r → m α)
+     → (handle ioMode r → m α)
 wrap f = \h → liftIO $ sanitizeIOError $ f (unsafeHandle h)
 
-wrap2 ∷ MonadIO m
+wrap2 ∷ (FileHandle handle, MonadIO m)
       ⇒ (Handle ioMode → β → IO α)
-      → (RegionalFileHandle ioMode r → β → m α)
+      → (handle ioMode r → β → m α)
 wrap2 f = \h y → liftIO $ sanitizeIOError $ f (unsafeHandle h) y
 
-wrap3 ∷ MonadIO m
+wrap3 ∷ (FileHandle handle, MonadIO m)
       ⇒ (Handle ioMode → γ → β → IO α)
-      → (RegionalFileHandle ioMode r → γ → β → m α)
+      → (handle ioMode r → γ → β → m α)
 wrap3 f = \h z y → liftIO $ sanitizeIOError $ f (unsafeHandle h) z y
 
 -- | Modify thrown @IOErrors@ in the given computation by erasing the
diff --git a/safer-file-handles.cabal b/safer-file-handles.cabal
--- a/safer-file-handles.cabal
+++ b/safer-file-handles.cabal
@@ -1,5 +1,5 @@
 name:          safer-file-handles
-version:       0.9
+version:       0.10
 cabal-version: >=1.6
 build-type:    Custom
 license:       BSD3
@@ -53,12 +53,12 @@
   GHC-Options: -Wall
   build-depends: base                      >= 4     && < 4.4
                , base-unicode-symbols      >= 0.1.1 && < 0.3
-               , regions                   >= 0.8   && < 0.9
+               , regions                   >= 0.9   && < 0.10
                , transformers              >= 0.2   && < 0.3
-               , monad-peel                >= 0.1   && < 0.3
+               , monad-control             >= 0.2   && < 0.3
                , explicit-iomodes          >= 0.5   && < 0.7
                , pathtype                  >= 0.0.1 && < 0.6
-               , regional-pointers         >= 0.5   && < 0.6
+               , regional-pointers         >= 0.6   && < 0.7
   exposed-modules: System.IO.SaferFileHandles
                    System.IO.SaferFileHandles.Unsafe
   other-modules:   System.IO.SaferFileHandles.Internal
