diff --git a/Data/Conduit/Network.hs b/Data/Conduit/Network.hs
--- a/Data/Conduit/Network.hs
+++ b/Data/Conduit/Network.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeFamilies #-}
 module Data.Conduit.Network
     ( -- * Basic utilities
       sourceSocket
@@ -23,10 +24,11 @@
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as S
 import Control.Monad.IO.Class (liftIO)
-import Control.Exception (bracketOnError, IOException, bracket, throwIO, SomeException, try)
+import Control.Exception (bracketOnError, IOException, throwIO, SomeException, try)
+import Control.Exception.Lifted (bracket)
 import Control.Monad (forever)
 import Control.Monad.Trans.Resource (register)
-import Control.Concurrent (forkIO)
+import Control.Concurrent.Lifted (fork)
 
 -- | Stream data from the socket.
 --
@@ -66,6 +68,11 @@
                 -> Sink ByteString IO ()
                 -> ResourceT IO ()
 
+-- | Same as @Application@, but allows an arbitrary inner monad.
+type ApplicationM m = Source m ByteString
+                   -> Sink ByteString m ()
+                   -> ResourceT m ()
+
 -- | Settings for a TCP server. It takes a port to listen on, and an optional
 -- hostname to bind to.
 --
@@ -80,15 +87,15 @@
 -- each connection.
 --
 -- Since 0.2.1
-runTCPServer :: ServerSettings -> Application -> IO ()
+runTCPServer :: (Base m ~ IO, ResourceIO m) => ServerSettings -> ApplicationM m -> m ()
 runTCPServer (ServerSettings port host) app = bracket
-    (bindPort host port)
-    NS.sClose
+    (liftIO $ bindPort host port)
+    (liftIO . NS.sClose)
     (forever . serve)
   where
     serve lsocket = do
-        (socket, _addr) <- NS.accept lsocket
-        forkIO $ runResourceT $ do
+        (socket, _addr) <- liftIO $ NS.accept lsocket
+        fork $ runResourceT $ do
             _ <- register $ NS.sClose socket
             app (sourceSocket socket) (sinkSocket socket)
 
@@ -101,10 +108,10 @@
 -- | Run an @Application@ by connecting to the specified server.
 --
 -- Since 0.2.1
-runTCPClient :: ClientSettings -> Application -> IO ()
+runTCPClient :: ResourceIO m => ClientSettings -> ApplicationM m -> m ()
 runTCPClient (ClientSettings port host) app = bracket
-    (getSocket host port)
-    NS.sClose
+    (liftIO $ getSocket host port)
+    (liftIO . NS.sClose)
     (\s -> runResourceT $ app (sourceSocket s) (sinkSocket s))
 
 -- | Attempt to connect to the given host/port.
diff --git a/network-conduit.cabal b/network-conduit.cabal
--- a/network-conduit.cabal
+++ b/network-conduit.cabal
@@ -1,5 +1,5 @@
 Name:                network-conduit
-Version:             0.2.1.1
+Version:             0.2.1.2
 Synopsis:            Stream socket data using conduits.
 Description:         Stream socket data using conduits.
 License:             BSD3
@@ -20,7 +20,8 @@
   Build-depends:       base                     >= 4            && < 5
                      , transformers             >= 0.2.2        && < 0.3
                      , bytestring               >= 0.9
-                     , conduit                  >= 0.2
+                     , conduit                  >= 0.2          && < 0.3
+                     , lifted-base              >= 0.1          && < 0.2
   if flag(network-bytestring)
         build-depends: network               >= 2.2.1   && < 2.2.3
                      , network-bytestring    >= 0.1.3   && < 0.1.4
