diff --git a/Data/Conduit/TMChan.hs b/Data/Conduit/TMChan.hs
--- a/Data/Conduit/TMChan.hs
+++ b/Data/Conduit/TMChan.hs
@@ -56,6 +56,7 @@
 import Control.Applicative
 import Control.Monad
 import Control.Monad.IO.Class ( liftIO, MonadIO )
+import Control.Monad.Trans.Class
 import Control.Monad.Trans.Resource
 import Control.Concurrent.STM
 import Control.Concurrent.STM.TBMChan
@@ -146,10 +147,10 @@
 --
 --   The order of the new source's data is undefined, but it will be some
 --   combination of the two given sources.
-(>=<) :: (MonadIO m, MonadBaseControl IO m)
-      => Source (ResourceT m) a
-      -> Source (ResourceT m) a
-      -> ResourceT m (Source (ResourceT m) a)
+(>=<) :: (MonadResource mi, MonadIO mo, MonadBaseControl IO mi)
+      => Source mi a
+      -> Source mi a
+      -> mi (Source mo a)
 sa >=< sb = mergeSources [ sa, sb ] 16
 {-# INLINE (>=<) #-}
 
@@ -163,14 +164,15 @@
 --   sources in a first-come-first-serve basis.
 --
 --   The order of the new source's data is undefined, but it will be some
---   combination of the given sources.
-mergeSources :: (MonadIO m, MonadBaseControl IO m)
-             => [Source (ResourceT m) a] -- ^ The sources to merge.
+--   combination of the given sources. The monad of the resultant source
+--   (@mo@) is independent of the monads of the input sources (@mi@).
+mergeSources :: (MonadResource mi, MonadIO mo, MonadBaseControl IO mi)
+             => [Source mi a] -- ^ The sources to merge.
              -> Int -- ^ The bound of the intermediate channel.
-             -> ResourceT m (Source (ResourceT m) a)
+             -> mi (Source mo a)
 mergeSources sx bound = do c <- liftSTM $ newTBMChan bound
                            refcount <- liftSTM . newTVar $ length sx
-                           mapM_ (\s -> resourceForkIO $ s $$ chanSink c writeTBMChan $ decRefcount refcount) sx
+                           mapM_ (\s -> runResourceT $ resourceForkIO $ s $$ chanSink c writeTBMChan $ decRefcount refcount) (map (transPipe lift) sx)
                            return $ sourceTBMChan c
 
 -- | Combines two conduits with unbounded channels, creating a new conduit
@@ -178,11 +180,11 @@
 --
 --   The order of the new conduit's output is undefined, but it will be some
 --   combination of the two given conduits.
-(<=>) :: (MonadIO m, MonadBaseControl IO m)
+(<=>) :: (MonadIO mi, MonadIO mo, MonadBaseControl IO mi)
       => Show i
-      => Conduit i (ResourceT m) i
-      -> Conduit i (ResourceT m) i
-      -> ResourceT m (Conduit i (ResourceT m) i)
+      => Conduit i (ResourceT mi) i
+      -> Conduit i (ResourceT mi) i
+      -> ResourceT mi (Conduit i mo i)
 sa <=> sb = mergeConduits [ sa, sb ] 16
 {-# INLINE (<=>) #-}
 
@@ -191,11 +193,12 @@
 --   given conduits in a first-come-first-serve basis.
 --
 --   The order of the new conduits's outputs is undefined, but it will be some
---   combination of the given conduits.
-mergeConduits :: (MonadIO m, MonadBaseControl IO m)
-              => [Conduit i (ResourceT m) o] -- ^ The conduits to merge.
+--   combination of the given conduits. The monad of the resultant conduit
+--   (@mo@) is independent of the monads of the input conduits (@mi@).
+mergeConduits :: (MonadIO mi, MonadIO mo, MonadBaseControl IO mi)
+              => [Conduit i (ResourceT mi) o] -- ^ The conduits to merge.
               -> Int -- ^ The bound for the channels.
-              -> ResourceT m (Conduit i (ResourceT m) o)
+              -> ResourceT mi (Conduit i mo o)
 mergeConduits conduits bound = do
         let len = length conduits
         refcount <- liftSTM $ newTVar len
diff --git a/stm-conduit.cabal b/stm-conduit.cabal
--- a/stm-conduit.cabal
+++ b/stm-conduit.cabal
@@ -1,5 +1,5 @@
 Name:                stm-conduit
-Version:             2.5.0
+Version:             2.5.1
 Synopsis:            Introduces conduits to channels, and promotes using
                      conduits concurrently.
 Description:         Provides two simple conduit wrappers around STM
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -70,7 +70,7 @@
 test_multipleWriters = do ms <- runResourceT $ mergeSources [ sourceList ([1..10]::[Integer])
                                                             , sourceList ([11..20]::[Integer])
                                                             ] 3
-                          xs <- runResourceT $ ms $$ consume
+                          xs <- ms $$ consume
                           assertEqual "for the numbers [1..10] and [11..20]," [1..20] $ sort xs
 
 test_asyncOperator = do sum'  <- CL.sourceList [1..n] $$ CL.fold (+) 0
@@ -119,5 +119,5 @@
     let
       input = [1..10]
       expected = Prelude.map (2 *) input ++ tail (Prelude.scanl (+) 0 input)
-    xs <- runResourceT $ sourceList ([1..10] :: [Integer]) $$ merged =$ consume
+    xs <- sourceList ([1..10] :: [Integer]) $$ merged =$ consume
     assertEqual "merged results" (sort expected) (sort xs)
