diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+## Zip 0.2.0
+
+* Added `MonadBase` and `MonadBaseControl` instances for the `ZipArchive`
+  monad. Also exported the `ZipState` type without revealing its data
+  constructor and records.
+
+* Dropped `MonadThrow` and `MonadCatch` constraints for `createArchive` and
+  `withArchive`.
+
 ## Zip 0.1.11
 
 * Minor refactoring.
diff --git a/Codec/Archive/Zip.hs b/Codec/Archive/Zip.hs
--- a/Codec/Archive/Zip.hs
+++ b/Codec/Archive/Zip.hs
@@ -80,6 +80,8 @@
 -- >   B.putStrLn bs
 
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MultiParamTypeClasses      #-}
+{-# LANGUAGE TypeFamilies               #-}
 
 module Codec.Archive.Zip
   ( -- * Types
@@ -98,6 +100,7 @@
   , ZipException (..)
     -- * Archive monad
   , ZipArchive
+  , ZipState
   , createArchive
   , withArchive
     -- * Retrieving information
@@ -141,11 +144,13 @@
 
 import Codec.Archive.Zip.Type
 import Control.Monad
+import Control.Monad.Base (MonadBase (..))
 import Control.Monad.Catch
 import Control.Monad.State.Strict
-import Control.Monad.Trans.Resource (ResourceT, runResourceT, MonadResource)
+import Control.Monad.Trans.Control (MonadBaseControl (..))
+import Control.Monad.Trans.Resource (ResourceT, MonadResource)
 import Data.ByteString (ByteString)
-import Data.Conduit (Source, Sink, ($$), yield)
+import Data.Conduit (Source, Sink, (.|))
 import Data.Map.Strict (Map, (!))
 import Data.Sequence (Seq, (|>))
 import Data.Text (Text)
@@ -154,6 +159,7 @@
 import Path
 import Path.IO
 import qualified Codec.Archive.Zip.Internal as I
+import qualified Data.Conduit               as C
 import qualified Data.Conduit.Binary        as CB
 import qualified Data.Conduit.List          as CL
 import qualified Data.Map.Strict            as M
@@ -178,8 +184,26 @@
              , MonadCatch
              , MonadMask )
 
--- | Internal state record used by the 'ZipArchive' monad.
+-- | @since 0.2.0
 
+instance MonadBase IO ZipArchive where
+  liftBase = liftIO
+
+-- | @since 0.2.0
+
+instance MonadBaseControl IO ZipArchive where
+  type StM ZipArchive a = (a, ZipState)
+  liftBaseWith f = ZipArchive . StateT $ \s ->
+    (\x -> (x, s)) <$> f (flip runStateT s . unZipArchive)
+  {-# INLINEABLE liftBaseWith #-}
+  restoreM       = ZipArchive . StateT . const . return
+  {-# INLINEABLE restoreM #-}
+
+-- | Internal state record used by the 'ZipArchive' monad. This is only
+-- exported for use with 'MonadBaseControl' methods, you can't look inside.
+--
+-- @since 0.2.0
+
 data ZipState = ZipState
   { zsFilePath  :: Path Abs File
     -- ^ Absolute path to zip archive
@@ -196,11 +220,11 @@
 -- specified file if it already exists. See 'withArchive' if you want to
 -- work with an existing archive.
 
-createArchive :: (MonadIO m, MonadCatch m)
+createArchive :: MonadIO m
   => Path b File       -- ^ Location of archive file to create
   -> ZipArchive a      -- ^ Actions that form archive's content
   -> m a
-createArchive path m = do
+createArchive path m = liftIO $ do
   apath <- makeAbsolute path
   ignoringAbsence (removeFile apath)
   let st = ZipState
@@ -209,7 +233,7 @@
         , zsArchive  = ArchiveDescription Nothing 0 0
         , zsActions  = S.empty }
       action = unZipArchive (liftM2 const m commit)
-  liftIO (evalStateT action st)
+  evalStateT action st
 
 -- | Work with an existing archive. See 'createArchive' if you want to
 -- create a new archive instead.
@@ -236,11 +260,11 @@
 -- design decision to make it impossible to create non-portable archives
 -- with this library.
 
-withArchive :: (MonadIO m, MonadThrow m)
+withArchive :: MonadIO m
   => Path b File       -- ^ Location of archive to work with
   -> ZipArchive a      -- ^ Actions on that archive
   -> m a
-withArchive path m = do
+withArchive path m = liftIO $ do
   apath           <- canonicalizePath path
   (desc, entries) <- liftIO (I.scanArchive apath)
   let st = ZipState
@@ -323,7 +347,7 @@
      -- ^ Contents of the entry (if found)
 sourceEntry s sink = do
   src <- getEntrySource s
-  (liftIO . runResourceT) (src $$ sink)
+  (liftIO . C.runConduitRes) (src .| sink)
 
 -- | Save a specific archive entry as a file in the file system.
 --
@@ -385,7 +409,7 @@
   -> ByteString        -- ^ Entry contents
   -> EntrySelector     -- ^ Name of entry to add
   -> ZipArchive ()
-addEntry t b s = addPending (I.SinkEntry t (yield b) s)
+addEntry t b s = addPending (I.SinkEntry t (C.yield b) s)
 
 -- | Stream data from the specified source to an archive entry.
 
diff --git a/Codec/Archive/Zip/Internal.hs b/Codec/Archive/Zip/Internal.hs
--- a/Codec/Archive/Zip/Internal.hs
+++ b/Codec/Archive/Zip/Internal.hs
@@ -26,13 +26,12 @@
 import Control.Monad
 import Control.Monad.Catch
 import Control.Monad.Trans.Maybe
-import Control.Monad.Trans.Resource (ResourceT, runResourceT, MonadResource)
+import Control.Monad.Trans.Resource (ResourceT, MonadResource)
 import Data.Bits
 import Data.Bool (bool)
 import Data.ByteString (ByteString)
 import Data.Char (ord)
-import Data.Conduit (Conduit, Source, Sink, (=$=), ($$), awaitForever, yield)
-import Data.Conduit.Internal (zipSinks)
+import Data.Conduit (Conduit, Source, Sink, (.|), ZipSink (..))
 import Data.Digest.CRC32 (crc32Update)
 import Data.Fixed (Fixed (..))
 import Data.Foldable (foldl')
@@ -50,6 +49,7 @@
 import System.IO
 import System.PlanB
 import qualified Data.ByteString     as B
+import qualified Data.Conduit        as C
 import qualified Data.Conduit.BZlib  as BZ
 import qualified Data.Conduit.Binary as CB
 import qualified Data.Conduit.List   as CL
@@ -218,7 +218,7 @@
   -> Bool              -- ^ Should we stream uncompressed data?
   -> Source m ByteString -- ^ Source of uncompressed data
 sourceEntry path EntryDescription {..} d =
-  source =$= CB.isolate (fromIntegral edCompressedSize) =$= decompress
+  source .| CB.isolate (fromIntegral edCompressedSize) .| decompress
   where
     source = CB.sourceIOHandle $ do
       h <- openFile (toFilePath path) ReadMode
@@ -231,7 +231,7 @@
           return h
     decompress = if d
       then decompressingPipe edCompression
-      else awaitForever yield
+      else C.awaitForever C.yield
 
 -- | Undertake /all/ actions specified as the fourth argument of the
 -- function. This transforms given pending actions so they can be performed
@@ -414,13 +414,13 @@
         , edComment          = M.lookup s eaEntryComment <|> oldComment
         , edExtraField       = extraField }
   B.hPut h (runPut (putHeader LocalHeader s desc0))
-  DataDescriptor {..} <- runResourceT $
+  DataDescriptor {..} <- C.runConduitRes $
     if recompression
       then
         if compressed == Store
-          then src $$ sinkData h compression
-          else src =$= decompressingPipe compressed $$ sinkData h compression
-      else src $$ sinkData h Store
+          then src .| sinkData h compression
+          else src .| decompressingPipe compressed .| sinkData h compression
+      else src .| sinkData h Store
   afterStreaming <- hTell h
   let desc1 = case o of
         GenericOrigin -> desc0
@@ -453,16 +453,20 @@
      -- ^ 'Sink' where to stream data
 sinkData h compression = do
   let sizeSink  = CL.fold (\acc input -> fromIntegral (B.length input) + acc) 0
-      dataSink  = fst <$> zipSinks sizeSink (CB.sinkHandle h)
-      withCompression = zipSinks (zipSinks sizeSink crc32Sink)
-  ((uncompressedSize, crc32), compressedSize) <-
+      dataSink  = getZipSink $
+        ZipSink sizeSink <* ZipSink (CB.sinkHandle h)
+      withCompression sink = getZipSink $
+        (,,) <$> ZipSink sizeSink
+             <*> ZipSink crc32Sink
+             <*> ZipSink sink
+  (uncompressedSize, crc32, compressedSize) <-
     case compression of
       Store   -> withCompression
         dataSink
       Deflate -> withCompression $
-        Z.compress 9 (Z.WindowBits (-15)) =$= dataSink
+        Z.compress 9 (Z.WindowBits (-15)) .| dataSink
       BZip2   -> withCompression $
-        BZ.bzip2 =$= dataSink
+        BZ.bzip2 .| dataSink
   return DataDescriptor
     { ddCRC32            = fromIntegral crc32
     , ddCompressedSize   = compressedSize
@@ -968,7 +972,7 @@
   :: MonadResource m
   => CompressionMethod
   -> Conduit ByteString m ByteString
-decompressingPipe Store   = awaitForever yield
+decompressingPipe Store   = C.awaitForever C.yield
 decompressingPipe Deflate = Z.decompress $ Z.WindowBits (-15)
 decompressingPipe BZip2   = BZ.bunzip2
 
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP               #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TemplateHaskell   #-}
@@ -12,7 +13,6 @@
 import Control.Monad.IO.Class
 import Data.Bits (complement)
 import Data.ByteString (ByteString)
-import Data.Conduit (yield)
 import Data.Foldable (foldl')
 import Data.List (intercalate)
 import Data.Map (Map, (!))
@@ -30,6 +30,7 @@
 import qualified Data.ByteString         as B
 import qualified Data.ByteString.Builder as LB
 import qualified Data.ByteString.Lazy    as LB
+import qualified Data.Conduit            as C
 import qualified Data.Conduit.List       as CL
 import qualified Data.Map                as M
 import qualified Data.Set                as E
@@ -324,7 +325,7 @@
   context "when an entry is sunk" $
     it "is there" $ \path -> property $ \m b s -> do
       info <- createArchive path $ do
-        sinkEntry m (yield b) s
+        sinkEntry m (C.yield b) s
         commit
         (,) <$> sourceEntry s (CL.foldMap id)
           <*> (edCompression . (! s) <$> getEntries)
@@ -611,7 +612,12 @@
   it "packs arbitrary directory recursively" $
     \path -> property $ \contents -> do
       let dir = parent path
+#if MIN_VERSION_path(0,6,0)
+          f   = stripProperPrefix dir >=> mkEntrySelector
+#else
           f   = stripDir dir >=> mkEntrySelector
+#endif
+
       blew <- catchIOError (do
         forM_ contents $ \s -> do
           let item = dir </> unEntrySelector s
@@ -638,7 +644,11 @@
       when blew discard -- TODO
       removeFile path
       selectors <- listDirRecur dir >>=
+#if MIN_VERSION_path(0,6,0)
+        mapM (stripProperPrefix dir >=> mkEntrySelector) . snd
+#else
         mapM (stripDir dir >=> mkEntrySelector) . snd
+#endif
       E.fromList selectors `shouldBe` M.keysSet m
 
 ----------------------------------------------------------------------------
diff --git a/zip.cabal b/zip.cabal
--- a/zip.cabal
+++ b/zip.cabal
@@ -1,6 +1,6 @@
 name:                 zip
-version:              0.1.11
-cabal-version:        >= 1.10
+version:              0.2.0
+cabal-version:        >= 1.18
 tested-with:          GHC==7.10.3, GHC==8.0.2, GHC==8.2.1
 license:              BSD3
 license-file:         LICENSE.md
@@ -26,20 +26,22 @@
                     , bzlib-conduit    >= 0.2     && < 0.3
                     , case-insensitive >= 1.2.0.2 && < 1.3
                     , cereal           >= 0.3     && < 0.6
-                    , conduit          >= 1.1     && < 2.0
+                    , conduit          >= 1.2.8   && < 2.0
                     , conduit-extra    >= 1.1     && < 2.0
                     , containers       >= 0.5.6.2 && < 0.6
                     , digest           < 0.1
                     , exceptions       >= 0.6     && < 0.9
                     , filepath         >= 1.2     && < 1.5
+                    , monad-control    >= 1.0     && < 1.1
                     , mtl              >= 2.0     && < 3.0
-                    , path             >= 0.5     && < 0.6
+                    , path             >= 0.5     && < 0.7
                     , path-io          >= 1.0.1   && < 2.0
                     , plan-b           >= 0.2     && < 0.3
                     , resourcet        >= 1.0     && < 2.0
                     , text             >= 0.2     && < 1.3
                     , time             >= 1.4     && < 1.9
                     , transformers     >= 0.4     && < 0.6
+                    , transformers-base
   if !impl(ghc >= 8.0)
     build-depends:    semigroups       >= 0.16
   default-extensions: RecordWildCards
@@ -64,13 +66,13 @@
     ghc-options:      -O2 -Wall
   build-depends:      base             >= 4.8     && < 5.0
                     , bytestring       >= 0.9     && < 0.11
-                    , conduit          >= 1.1     && < 2.0
+                    , conduit          >= 1.2.8   && < 2.0
                     , containers       >= 0.5.6.2 && < 0.6
                     , exceptions       >= 0.6     && < 0.9
                     , filepath         >= 1.2     && < 1.5
                     , QuickCheck       >= 2.4     && < 3.0
                     , hspec            >= 2.0     && < 3.0
-                    , path             >= 0.5     && < 6.0
+                    , path             >= 0.5     && < 0.7
                     , path-io          >= 1.0.1   && < 2.0
                     , text             >= 0.2     && < 1.3
                     , time             >= 1.4     && < 1.9
