diff --git a/System/USB/IO/Synchronous/Enumerator.hs b/System/USB/IO/Synchronous/Enumerator.hs
--- a/System/USB/IO/Synchronous/Enumerator.hs
+++ b/System/USB/IO/Synchronous/Enumerator.hs
@@ -22,45 +22,50 @@
 --------------------------------------------------------------------------------
 
 -- from base:
-import Prelude               ( fromInteger, fromIntegral )
-import Data.Function         ( ($) )
-import Data.Word             ( Word8 )
-import Data.Maybe            ( Maybe(Nothing, Just) )
-import Control.Monad         ( return, (>>=), fail )
-import Foreign.Storable      ( peek )
-import Foreign.Ptr           ( castPtr )
+import Prelude                          ( fromIntegral )
+import Data.Function                    ( ($) )
+import Data.Word                        ( Word8 )
+import Data.Maybe                       ( Maybe(Nothing, Just) )
+import Control.Monad                    ( return )
+import Foreign.Storable                 ( peek )
+import Foreign.Ptr                      ( castPtr )
+import Foreign.Marshal.Alloc            ( alloca, allocaBytes )
 
+#if __GLASGOW_HASKELL__ < 701
+import Prelude                          ( fromInteger )
+import Control.Monad                    ( (>>=), fail )
+#endif
+
 -- from base-unicode-symbols:
-import Data.Eq.Unicode       ( (≡), (≢) )
-import Data.Bool.Unicode     ( (∧) )
+import Data.Eq.Unicode                  ( (≡), (≢) )
+import Data.Bool.Unicode                ( (∧) )
 
 -- from bindings-libusb:
-import Bindings.Libusb ( c'libusb_bulk_transfer, c'libusb_interrupt_transfer
-                       , c'LIBUSB_SUCCESS, c'LIBUSB_ERROR_TIMEOUT
-                       )
+import Bindings.Libusb                  ( c'libusb_bulk_transfer
+                                        , c'libusb_interrupt_transfer
+                                        , c'LIBUSB_SUCCESS
+                                        , c'LIBUSB_ERROR_TIMEOUT
+                                        )
 
 -- from transformers:
-import Control.Monad.IO.Class ( liftIO )
-
--- from MonadCatchIO-transformers:
-import Control.Monad.CatchIO ( MonadCatchIO )
+import Control.Monad.IO.Class           ( liftIO )
 
--- from MonadCatchIO-transformers-foreign:
-import Control.Monad.CatchIO.Foreign ( alloca, allocaBytes )
+-- from monad-peel:
+import Control.Monad.IO.Peel            ( MonadPeelIO, liftIOOp )
 
 -- from usb:
-import System.USB.DeviceHandling ( DeviceHandle )
-import System.USB.Descriptors    ( EndpointAddress )
-import System.USB.IO.Synchronous ( Timeout, Size )
+import System.USB.DeviceHandling        ( DeviceHandle )
+import System.USB.Descriptors           ( EndpointAddress )
+import System.USB.IO.Synchronous        ( Timeout, Size )
 
-import System.USB.Unsafe ( C'TransferFunc
-                         , getDevHndlPtr
-                         , marshalEndpointAddress
-                         , convertUSBException
-                         )
+import System.USB.Unsafe                ( C'TransferFunc
+                                        , getDevHndlPtr
+                                        , marshalEndpointAddress
+                                        , convertUSBException
+                                        )
 
 #ifdef __HADDOCK__
-import System.USB.Descriptors    ( maxPacketSize, endpointMaxPacketSize )
+import System.USB.Descriptors           ( maxPacketSize, endpointMaxPacketSize )
 #endif
 
 #if MIN_VERSION_iteratee(0,4,0)
@@ -71,23 +76,23 @@
 import Data.NullPoint                   ( NullPoint(empty) )
 
 -- from base:
-import Control.Exception ( toException )
+import Control.Exception                ( toException )
 
 -- from base-unicode-symbols:
-import Data.Function.Unicode ( (∘) )
+import Data.Function.Unicode            ( (∘) )
 #else
 -- from iteratee:
-import Data.Iteratee.Base ( EnumeratorGM
-                          , StreamG(Chunk)
-                          , IterGV(Done, Cont)
-                          , runIter
-                          , enumErr
-                          , throwErr
-                          )
-import Data.Iteratee.Base.StreamChunk ( ReadableChunk(readFromPtr) )
+import Data.Iteratee.Base               ( EnumeratorGM
+                                        , StreamG(Chunk)
+                                        , IterGV(Done, Cont)
+                                        , runIter
+                                        , enumErr
+                                        , throwErr
+                                        )
+import Data.Iteratee.Base.StreamChunk   ( ReadableChunk(readFromPtr) )
 
 -- from base:
-import Text.Show ( show )
+import Text.Show                        ( show )
 #endif
 
 
@@ -95,7 +100,7 @@
 -- Enumerators
 --------------------------------------------------------------------------------
 #if MIN_VERSION_iteratee(0,4,0)
-enumReadBulk ∷ (ReadableChunk s Word8, NullPoint s, MonadCatchIO m)
+enumReadBulk ∷ (ReadableChunk s Word8, NullPoint s, MonadPeelIO m)
              ⇒ DeviceHandle    -- ^ A handle for the device to communicate with.
              → EndpointAddress -- ^ The address of a valid 'In' and 'Bulk'
                                --   endpoint to communicate with. Make sure the
@@ -111,7 +116,7 @@
              → Enumerator s m α
 enumReadBulk = enumRead c'libusb_bulk_transfer
 
-enumReadInterrupt ∷ (ReadableChunk s Word8, NullPoint s, MonadCatchIO m)
+enumReadInterrupt ∷ (ReadableChunk s Word8, NullPoint s, MonadPeelIO m)
                   ⇒ DeviceHandle    -- ^ A handle for the device to communicate
                                     --   with.
                   → EndpointAddress -- ^ The address of a valid 'In' and
@@ -133,7 +138,7 @@
 
 --------------------------------------------------------------------------------
 
-enumRead ∷ (ReadableChunk s Word8, NullPoint s, MonadCatchIO m)
+enumRead ∷ (ReadableChunk s Word8, NullPoint s, MonadPeelIO m)
          ⇒ C'TransferFunc → ( DeviceHandle
                             → EndpointAddress
                             → Size
@@ -144,8 +149,8 @@
                        endpoint
                        chunkSize
                        timeout → \iter →
-    alloca $ \transferredPtr →
-      allocaBytes chunkSize $ \dataPtr →
+    liftIOOp alloca $ \transferredPtr →
+     liftIOOp  (allocaBytes chunkSize) $ \dataPtr →
         let loop i = runIter i idoneM on_cont
             on_cont _ (Just e) = return $ throwErr e
             on_cont k Nothing  = do
@@ -170,7 +175,7 @@
 
 --------------------------------------------------------------------------------
 #else
-enumReadBulk ∷ (ReadableChunk s Word8, MonadCatchIO m)
+enumReadBulk ∷ (ReadableChunk s Word8, MonadPeelIO m)
              ⇒ DeviceHandle    -- ^ A handle for the device to communicate with.
              → EndpointAddress -- ^ The address of a valid 'In' and 'Bulk'
                                --   endpoint to communicate with. Make sure the
@@ -186,7 +191,7 @@
              → EnumeratorGM s Word8 m α
 enumReadBulk = enumRead c'libusb_bulk_transfer
 
-enumReadInterrupt ∷ (ReadableChunk s Word8, MonadCatchIO m)
+enumReadInterrupt ∷ (ReadableChunk s Word8, MonadPeelIO m)
                   ⇒ DeviceHandle    -- ^ A handle for the device to communicate
                                     --   with.
                   → EndpointAddress -- ^ The address of a valid 'In' and
@@ -208,7 +213,7 @@
 
 --------------------------------------------------------------------------------
 
-enumRead ∷ (ReadableChunk s Word8, MonadCatchIO m)
+enumRead ∷ (ReadableChunk s Word8, MonadPeelIO m)
          ⇒ C'TransferFunc → ( DeviceHandle
                             → EndpointAddress
                             → Size
@@ -219,8 +224,8 @@
                        endpoint
                        chunkSize
                        timeout → \iter →
-    alloca $ \transferredPtr →
-      allocaBytes chunkSize $ \dataPtr →
+    liftIOOp alloca $ \transferredPtr →
+      liftIOOp (allocaBytes chunkSize) $ \dataPtr →
         let loop i1 = do
               err ← liftIO $ c'transfer (getDevHndlPtr devHndl)
                                         (marshalEndpointAddress endpoint)
diff --git a/usb-enumerator.cabal b/usb-enumerator.cabal
--- a/usb-enumerator.cabal
+++ b/usb-enumerator.cabal
@@ -1,5 +1,5 @@
 name:          usb-enumerator
-version:       0.1.0.3
+version:       0.2
 cabal-version: >=1.6
 build-type:    Custom
 license:       BSD3
@@ -18,12 +18,12 @@
 
 Library
   GHC-Options: -Wall
+
   build-depends: base                              >= 4     && < 4.4
                , base-unicode-symbols              >= 0.1.1 && < 0.3
                , bindings-libusb                   >= 1.3   && < 1.5
-               , iteratee                          >= 0.3.5 && < 0.5
+               , iteratee                          >= 0.3.5 && < 0.6
                , transformers                      >= 0.2   && < 0.3
-               , MonadCatchIO-transformers         >= 0.2   && < 0.3
-               , MonadCatchIO-transformers-foreign >= 0.1   && < 0.2
+               , monad-peel                        >= 0.1   && < 0.2
                , usb                               >= 0.5   && < 0.7
   exposed-modules: System.USB.IO.Synchronous.Enumerator
