diff --git a/System/USB/Safe.hs b/System/USB/Safe.hs
--- a/System/USB/Safe.hs
+++ b/System/USB/Safe.hs
@@ -182,9 +182,8 @@
 --------------------------------------------------------------------------------
 
 -- from base:
-import Prelude                    ( fromInteger )
 import Control.Concurrent.MVar    ( MVar, newMVar, takeMVar, putMVar, withMVar )
-import Control.Monad              ( Monad, return, (>>=), fail, (>>), when, liftM )
+import Control.Monad              ( Monad, return, (>>=), (>>), when, liftM )
 import Control.Exception          ( Exception, throwIO )
 import Data.Typeable              ( Typeable )
 import Data.Function              ( ($) )
@@ -197,6 +196,11 @@
 import System.IO                  ( IO )
 import Text.Show                  ( Show )
 
+#if __GLASGOW_HASKELL__ < 701
+import Prelude                    ( fromInteger )
+import Control.Monad              ( fail )
+#endif
+
 -- from base-unicode-symbols:
 import Data.Bool.Unicode          ( (∧) )
 import Data.Eq.Unicode            ( (≡) )
@@ -208,11 +212,13 @@
 -- from transformers:
 import Control.Monad.IO.Class     ( MonadIO, liftIO )
 
--- from MonadCatchIO-transformers:
-import Control.Monad.CatchIO      ( MonadCatchIO, bracket_, throw, block )
+-- from monad-peel:
+import Control.Monad.IO.Peel      ( MonadPeelIO )
+import Control.Exception.Peel     ( bracket_, block )
+import qualified Control.Exception.Peel as P ( throwIO )
 
 -- from regions:
-import Control.Monad.Trans.Region.OnExit ( CloseHandle, onExit )
+import Control.Monad.Trans.Region.OnExit ( FinalizerHandle, onExit )
 import Control.Monad.Trans.Region     -- (re-exported entirely)
 
 -- from iteratee:
@@ -290,7 +296,7 @@
 -}
 data RegionalDeviceHandle (r ∷ * → *) = RegionalDeviceHandle !(USB.DeviceHandle)
                                                              !(MVar Bool)
-                                                             !(CloseHandle r)
+                                                             !(FinalizerHandle r)
 
 instance Dup RegionalDeviceHandle where
     dup (RegionalDeviceHandle h mv ch) = liftM (RegionalDeviceHandle h mv) $ dup ch
@@ -310,7 +316,7 @@
 
  * Another 'USB.USBException'.
 -}
-openDevice ∷ MonadCatchIO pr
+openDevice ∷ MonadPeelIO pr
            ⇒ USB.Device → RegionT s pr (RegionalDeviceHandle (RegionT s pr))
 openDevice dev = block $ do
                    h  ← liftIO $ USB.openDevice dev
@@ -321,7 +327,7 @@
 {-| Convenience function which opens the device, applies the given continuation
 function to the resulting regional device handle and runs the resulting region.
 -}
-withDevice ∷ MonadCatchIO pr
+withDevice ∷ MonadPeelIO pr
            ⇒ USB.Device
            → (∀ s. RegionalDeviceHandle (RegionT s pr) → RegionT s pr α)
            → pr α
@@ -344,14 +350,25 @@
  * Another 'USB.USBException'.
 -}
 withDeviceWhich ∷ ∀ pr α
-                . MonadCatchIO pr
+                . MonadPeelIO pr
                 ⇒ USB.Ctx
                 → (USB.DeviceDesc → Bool) -- ^ Predicate on the device descriptor.
                 → (∀ s. RegionalDeviceHandle (RegionT s pr) → RegionT s pr α)
                                           -- ^ Continuation function
                 → pr α
-withDeviceWhich ctx p f = do devs ← liftIO $ USB.getDevices ctx
-                             useWhich devs withDevice p f
+withDeviceWhich ctx p f = do
+  devs ← liftIO $ USB.getDevices ctx
+#if __GLASGOW_HASKELL__ < 700
+  useWhich devs withDevice p f
+#else
+    -- GHC-7 simplified the treatment of impredicativity
+    -- which unfortunately causes the above to break.
+    -- See: http://thread.gmane.org/gmane.comp.lang.haskell.glasgow.user/19134/focus=19153
+    -- A solution is to just inline the code of useWhich: (I know this is ugly!)
+  case find (p ∘ getDesc) devs of
+    Nothing  → P.throwIO USB.NotFoundException
+    Just dev → withDevice dev f
+#endif
 
 -- | Internally used function which searches through the given list of USB
 -- entities (like Devices, Configs, Interfaces or Alternates) for the first
@@ -365,7 +382,7 @@
          → k             -- ^ Continuation function
          → m α
 useWhich ds w p f = case find (p ∘ getDesc) ds of
-                      Nothing → throw USB.NotFoundException
+                      Nothing → P.throwIO USB.NotFoundException
                       Just d  → w d f
 
 -- | Internally used function for getting the actual USB device handle from a
@@ -398,7 +415,7 @@
 The system will attempt to restore the previous configuration
 and alternate settings after the reset has completed.
 
-Note the constraint: @pr \`ParentOf\` cr@. This allows this function to be
+Note the constraint: @pr \`AncestorRegion\` cr@. This allows this function to be
 executed in any child region @cr@ of the parent region @pr@ in which the given
 regional handle was created.
 
@@ -426,7 +443,7 @@
 
  * Another 'USB.USBException'.
 -}
-resetDevice ∷ (pr `ParentOf` cr, MonadIO cr)
+resetDevice ∷ (pr `AncestorRegion` cr, MonadIO cr)
             ⇒ RegionalDeviceHandle pr → cr ()
 resetDevice (RegionalDeviceHandle internalDevHndl mv _) =
     liftIO $ withMVar mv $ \configAlreadySet → if configAlreadySet
@@ -527,7 +544,7 @@
  * Another 'USB.USBException'.
 -}
 setConfig ∷ ∀ pr cr α
-          . (pr `ParentOf` cr, MonadCatchIO cr)
+          . (pr `AncestorRegion` cr, MonadPeelIO cr)
           ⇒ Config pr                          -- ^ The configuration you wish to set.
           → (∀ sCfg. ConfigHandle sCfg → cr α) -- ^ Continuation function.
           → cr α
@@ -540,7 +557,7 @@
 -- the given @MVar@ was set. If the given @MVar@ wasn't set it will be set
 -- before the given computation is performed. When the computation terminates,
 -- wheter normally or by raising an exception, the @MVar@ will be unset again.
-withUnsettedMVar ∷ MonadCatchIO m ⇒ MVar Bool → m α → m α
+withUnsettedMVar ∷ MonadPeelIO m ⇒ MVar Bool → m α → m α
 withUnsettedMVar mv = bracket_ (liftIO $ do alreadySet ← takeMVar mv
                                             if alreadySet
                                               then do putMVar mv alreadySet
@@ -551,7 +568,7 @@
 -- | Internally used function which sets the @MVar@ before the computation is
 -- performed. When the computation terminates, wheter normally or by raising an
 -- exception, the @MVar@ will be unset again.
-withSettedMVar ∷ MonadCatchIO m ⇒ MVar Bool → m α → m α
+withSettedMVar ∷ MonadPeelIO m ⇒ MVar Bool → m α → m α
 withSettedMVar mv = bracket_ (liftIO $ overwriteMVar mv True)
                              (liftIO $ overwriteMVar mv False)
 
@@ -594,7 +611,7 @@
  * Another 'USB.USBException'.
 -}
 useActiveConfig ∷ ∀ pr cr α
-                . (pr `ParentOf` cr, MonadCatchIO cr)
+                . (pr `AncestorRegion` cr, MonadPeelIO cr)
                 ⇒ RegionalDeviceHandle pr -- ^ Regional handle to the device
                                           --   from which you want to use the
                                           --   active configuration.
@@ -603,7 +620,7 @@
 useActiveConfig (RegionalDeviceHandle internalDevHndl mv _) f =
     withSettedMVar mv $ do
       activeConfigValue ← liftIO $ USB.getConfig internalDevHndl
-      when (activeConfigValue ≡ 0) $ throw NoActiveConfig
+      when (activeConfigValue ≡ 0) $ P.throwIO NoActiveConfig
       let activeConfigHandle = ConfigHandle internalDevHndl activeConfigDesc
           activeConfigDesc = fromJust $ find isActive $ getConfigDescs internalDevHndl
           isActive = (activeConfigValue ≡) ∘ USB.configValue
@@ -638,7 +655,7 @@
  * Another 'USB.USBException'.
 -}
 setConfigWhich ∷ ∀ pr cr α
-               . (pr `ParentOf` cr, MonadCatchIO cr)
+               . (pr `AncestorRegion` cr, MonadPeelIO cr)
                ⇒ RegionalDeviceHandle pr -- ^ Regional handle to the device for
                                          --   which you want to set a
                                          --   configuration.
@@ -697,7 +714,7 @@
 data RegionalInterfaceHandle sCfg (r ∷ * → *) = RegionalInterfaceHandle
                                                   !(Interface sCfg)
                                                   !(MVar Bool)
-                                                  !(CloseHandle r)
+                                                  !(FinalizerHandle r)
 
 instance Dup (RegionalInterfaceHandle sCfg) where
     dup (RegionalInterfaceHandle interface mv ch) =
@@ -724,7 +741,7 @@
  * Another 'USB.USBException'.
 -}
 claim ∷ ∀ pr sCfg s
-      . MonadCatchIO pr
+      . MonadPeelIO pr
       ⇒ Interface sCfg  -- ^ Interface you wish to claim
       → RegionT s pr
           (RegionalInterfaceHandle sCfg
@@ -736,7 +753,7 @@
   return $ RegionalInterfaceHandle interface mv ch
 
 withInterface ∷ ∀ pr sCfg α
-              . MonadCatchIO pr
+              . MonadPeelIO pr
               ⇒ Interface sCfg -- ^ The interface you wish to claim.
               → (∀ s. RegionalInterfaceHandle sCfg (RegionT s pr)
                     → RegionT s pr α
@@ -761,7 +778,7 @@
 
 -}
 withInterfaceWhich ∷ ∀ pr sCfg α
-                   . MonadCatchIO pr
+                   . MonadPeelIO pr
                    ⇒ ConfigHandle sCfg      -- ^ Handle to a configuration of which
                                             --   you want to claim an interface.
                    → (USB.Interface → Bool) -- ^ Predicate on the interface descriptors.
@@ -841,7 +858,7 @@
  * Another 'USB.USBException'.
 -}
 setAlternate ∷ ∀ pr cr sCfg α
-             . (pr `ParentOf` cr, MonadCatchIO cr)
+             . (pr `AncestorRegion` cr, MonadPeelIO cr)
              ⇒ Alternate sCfg pr -- ^ The alternate you wish to set.
              → (∀ sAlt. AlternateHandle sAlt pr → cr α) -- ^ Continuation function.
              → cr α
@@ -872,7 +889,7 @@
  * Another 'USB.USBException'.
 -}
 useActiveAlternate ∷ ∀ pr cr sCfg α
-                   . (pr `ParentOf` cr, MonadCatchIO cr)
+                   . (pr `AncestorRegion` cr, MonadPeelIO cr)
                    ⇒ RegionalInterfaceHandle sCfg pr -- ^ Regional handle to the
                                               --   interface from which you want
                                               --   to use the active alternate.
@@ -886,9 +903,10 @@
       activeAltValue ← liftIO $ USB.getInterfaceAltSetting internalDevHndl
                                                            ifNum
                                                            timeout
-      let activeAlt = fromJust $ find isActive alts
-          isActive  = (activeAltValue ≡) ∘ USB.interfaceAltSetting
-      f $ AlternateHandle internalDevHndl activeAlt
+      let activeAltHandle = AlternateHandle internalDevHndl activeAlt
+          activeAlt = fromJust $ find isActive alts
+          isActive = (activeAltValue ≡) ∘ USB.interfaceAltSetting
+      f activeAltHandle
 
 
 {-| Convenience function which finds the first alternate of the given interface
@@ -910,7 +928,7 @@
  * Another 'USB.USBException'.
 -}
 setAlternateWhich ∷ ∀ pr cr sCfg α
-                  . (pr `ParentOf` cr, MonadCatchIO cr)
+                  . (pr `AncestorRegion` cr, MonadPeelIO cr)
                   ⇒ RegionalInterfaceHandle sCfg pr -- ^ Regional handle to the
                                                     --   interface for which you want
                                                     --   to set an alternate.
@@ -1056,7 +1074,7 @@
 
  * Another 'USB.USBException'.
 -}
-clearHalt ∷ (pr `ParentOf` cr, MonadIO cr)
+clearHalt ∷ (pr `AncestorRegion` cr, MonadIO cr)
           ⇒ Endpoint transDir transType sAlt pr → cr ()
 clearHalt (Endpoint internalDevHndl endpointDesc) =
     liftIO $ USB.clearHalt internalDevHndl $ USB.endpointAddress endpointDesc
@@ -1090,14 +1108,14 @@
 
         * Another 'USB.USBException'.
     -}
-    readEndpoint ∷ (pr `ParentOf` cr, MonadIO cr)
+    readEndpoint ∷ (pr `AncestorRegion` cr, MonadIO cr)
                  ⇒ Endpoint In transType sAlt pr
                  → ReadAction cr
 
 instance ReadEndpoint Bulk      where readEndpoint = transferWith USB.readBulk
 instance ReadEndpoint Interrupt where readEndpoint = transferWith USB.readInterrupt
 
-transferWith ∷ (pr `ParentOf` cr, MonadIO cr)
+transferWith ∷ (pr `AncestorRegion` cr, MonadIO cr)
              ⇒ (USB.DeviceHandle → USB.EndpointAddress → α → USB.Timeout → IO β)
              → (Endpoint transDir transType sAlt pr    → α → USB.Timeout → cr β)
 transferWith f = \endpoint sbs timeout → liftIO $ wrap f endpoint sbs timeout
@@ -1131,7 +1149,7 @@
 
         * Another 'USB.USBException'.
     -}
-    writeEndpoint ∷ (pr `ParentOf` cr, MonadIO cr)
+    writeEndpoint ∷ (pr `AncestorRegion` cr, MonadIO cr)
                   ⇒ Endpoint Out transType sAlt pr
                   → WriteAction cr
 
@@ -1145,7 +1163,7 @@
 class EnumReadEndpoint transType where
     -- | An enumerator for an 'In' endpoint
     -- with either a 'Bulk' or 'Interrupt' transfer type.
-    enumReadEndpoint ∷ ( pr `ParentOf` cr, MonadCatchIO cr, ReadableChunk s Word8
+    enumReadEndpoint ∷ ( pr `AncestorRegion` cr, MonadPeelIO cr, ReadableChunk s Word8
 #if MIN_VERSION_iteratee(0,4,0)
                        , NullPoint s
 #endif
@@ -1200,7 +1218,7 @@
 
  *  Another 'USB.USBException'.
 -}
-control ∷ ∀ pr cr. (pr `ParentOf` cr, MonadIO cr)
+control ∷ ∀ pr cr. (pr `AncestorRegion` cr, MonadIO cr)
         ⇒ RegionalDeviceHandle pr → ControlAction (USB.Timeout → cr ())
 control regionalDevHndl = \reqType reqRecipient request value index → \timeout →
     liftIO $ USB.control (getInternalDevHndl regionalDevHndl)
@@ -1221,7 +1239,7 @@
 
  *  Another 'USB.USBException'.
 -}
-readControl ∷ ∀ pr cr. (pr `ParentOf` cr, MonadIO cr)
+readControl ∷ ∀ pr cr. (pr `AncestorRegion` cr, MonadIO cr)
             ⇒ RegionalDeviceHandle pr → ControlAction (ReadAction cr)
 readControl regionalDevHndl = \reqType reqRecipient request value index → \timeout size →
     liftIO $ USB.readControl (getInternalDevHndl regionalDevHndl)
@@ -1236,7 +1254,7 @@
 -- | A convenience function similar to 'readControl' which checks if the
 -- specified number of bytes to read were actually read.
 -- Throws an 'USB.IOException' if this is not the case.
-readControlExact ∷ ∀ pr cr. (pr `ParentOf` cr, MonadIO cr)
+readControlExact ∷ ∀ pr cr. (pr `AncestorRegion` cr, MonadIO cr)
                  ⇒ RegionalDeviceHandle pr → ControlAction
                      (USB.Size → USB.Timeout → cr ByteString)
 readControlExact regionalDevHndl = \reqType reqRecipient request value index → \timeout size →
@@ -1259,7 +1277,7 @@
 
  *  Another 'USB.USBException'.
 -}
-writeControl ∷ ∀ pr cr. (pr `ParentOf` cr, MonadIO cr)
+writeControl ∷ ∀ pr cr. (pr `AncestorRegion` cr, MonadIO cr)
              ⇒ RegionalDeviceHandle pr → ControlAction (WriteAction cr)
 writeControl regionalDevHndl = \reqType reqRecipient request value index → \timeout input →
     liftIO $ USB.writeControl (getInternalDevHndl regionalDevHndl)
@@ -1311,7 +1329,7 @@
 
 This function may throw 'USB.USBException's.
 -}
-getLanguages ∷ (pr `ParentOf` cr, MonadIO cr)
+getLanguages ∷ (pr `AncestorRegion` cr, MonadIO cr)
              ⇒ RegionalDeviceHandle pr → cr [USB.LangId]
 getLanguages devHndl =
     liftIO $ USB.getLanguages (getInternalDevHndl devHndl)
@@ -1331,7 +1349,7 @@
 words I would like to get a type error when they are some arbitrary number or
 come from another device.
 -}
-getStrDesc ∷ (pr `ParentOf` cr, MonadIO cr)
+getStrDesc ∷ (pr `AncestorRegion` cr, MonadIO cr)
            ⇒ RegionalDeviceHandle pr
            → USB.StrIx
            → USB.LangId
@@ -1351,7 +1369,7 @@
 
 This function may throw 'USB.USBException's.
 -}
-getStrDescFirstLang ∷ (pr `ParentOf` cr, MonadIO cr)
+getStrDescFirstLang ∷ (pr `AncestorRegion` cr, MonadIO cr)
                     ⇒ RegionalDeviceHandle pr
                     → USB.StrIx
                     → Int -- ^ Maximum number of characters in the requested
@@ -1377,7 +1395,7 @@
 
  * Another 'USB.USBException'.
 -}
-kernelDriverActive ∷ (pr `ParentOf` cr, MonadIO cr)
+kernelDriverActive ∷ (pr `AncestorRegion` cr, MonadIO cr)
                    ⇒ RegionalDeviceHandle pr → USB.InterfaceNumber → cr Bool
 kernelDriverActive regionalDevHndl =
     liftIO ∘ USB.kernelDriverActive (getInternalDevHndl regionalDevHndl)
@@ -1396,7 +1414,7 @@
 
  * Another 'USB.USBException'.
 -}
-detachKernelDriver ∷ (pr `ParentOf` cr, MonadIO cr)
+detachKernelDriver ∷ (pr `AncestorRegion` cr, MonadIO cr)
                    ⇒ RegionalDeviceHandle pr → USB.InterfaceNumber → cr ()
 detachKernelDriver regionalDevHndl =
     liftIO ∘ USB.detachKernelDriver (getInternalDevHndl regionalDevHndl)
@@ -1417,7 +1435,7 @@
 
  * Another 'USB.USBException'.
 -}
-attachKernelDriver ∷ (pr `ParentOf` cr, MonadIO cr)
+attachKernelDriver ∷ (pr `AncestorRegion` cr, MonadIO cr)
                    ⇒ RegionalDeviceHandle pr → USB.InterfaceNumber → cr ()
 attachKernelDriver regionalDevHndl =
     liftIO ∘ USB.attachKernelDriver (getInternalDevHndl regionalDevHndl)
@@ -1434,7 +1452,7 @@
 
  * Another 'USB.USBException'.
 -}
-withDetachedKernelDriver ∷ (pr `ParentOf` cr, MonadCatchIO cr)
+withDetachedKernelDriver ∷ (pr `AncestorRegion` cr, MonadPeelIO cr)
                          ⇒ RegionalDeviceHandle pr
                          → USB.InterfaceNumber
                          → cr α
diff --git a/usb-safe.cabal b/usb-safe.cabal
--- a/usb-safe.cabal
+++ b/usb-safe.cabal
@@ -1,5 +1,5 @@
 name:          usb-safe
-version:       0.10
+version:       0.11
 cabal-version: >=1.6
 build-type:    Custom
 license:       BSD3
@@ -69,13 +69,13 @@
 
 Library
   GHC-Options: -Wall -fno-warn-orphans
-  build-depends: base                      >= 4     && < 4.3
+  build-depends: base                      >= 4     && < 4.4
                , base-unicode-symbols      >= 0.1.1 && < 0.3
                , usb                       >= 0.5   && < 0.7
-               , usb-enumerator            >= 0.1   && < 0.2
-               , iteratee                  >= 0.3.5 && < 0.5
+               , usb-enumerator            >= 0.2   && < 0.3
+               , iteratee                  >= 0.3.5 && < 0.6
                , bytestring                >= 0.9   && < 0.10
-               , regions                   >= 0.6   && < 0.8
+               , regions                   >= 0.8   && < 0.9
                , transformers              >= 0.2   && < 0.3
-               , MonadCatchIO-transformers >= 0.2   && < 0.3
+               , monad-peel                >= 0.1   && < 0.2
   exposed-modules: System.USB.Safe
