diff --git a/simple-pipe.cabal b/simple-pipe.cabal
--- a/simple-pipe.cabal
+++ b/simple-pipe.cabal
@@ -2,7 +2,7 @@
 cabal-version:	>= 1.8
 
 name:		simple-pipe
-version:	0.0.0.20
+version:	0.0.0.21
 stability:	Experimental
 author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>
@@ -80,7 +80,7 @@
 source-repository	this
     type:	git
     location:	git://github.com/YoshikuniJujo/simple-pipe.git
-    tag:	simple-pipe-0.0.0.20
+    tag:	simple-pipe-0.0.0.21
 
 library
     hs-source-dirs:	src
diff --git a/src/Data/Pipe/ByteString.hs b/src/Data/Pipe/ByteString.hs
--- a/src/Data/Pipe/ByteString.hs
+++ b/src/Data/Pipe/ByteString.hs
@@ -19,41 +19,44 @@
 bufferSize :: Int
 bufferSize = 65536
 
-fromHandleLn :: (PipeClass p, Monad m,
-	MonadBaseControl IO (p i BSC.ByteString m)) =>
+fromHandleLn :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p i BSC.ByteString), Monad (p i BSC.ByteString m)) =>
 	Handle -> p i BSC.ByteString m ()
 fromHandleLn h = do
-	ml <- liftBase $ (Just <$> BSC.hGetLine h) `catch` \(e :: IOException) ->
+	ml <- lift . liftBase $
+		(Just <$> BSC.hGetLine h) `catch` \(e :: IOException) ->
 		case ioe_type e of
 			EOF -> return Nothing
 			_ -> ioException e
 	maybe (return ()) ((>> fromHandleLn h) . yield) ml
 
-toHandleLn :: (PipeClass p, Monad m, MonadBaseControl IO (p BSC.ByteString o m)) =>
+toHandleLn :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p BSC.ByteString o), Monad (p BSC.ByteString o m)) =>
 	Handle -> p BSC.ByteString o m ()
-toHandleLn h =
-	await >>= maybe (return ()) ((>> toHandleLn h) . liftBase . BSC.hPutStrLn h)
+toHandleLn h = await >>= maybe (return ())
+	((>> toHandleLn h) . lift . liftBase . BSC.hPutStrLn h)
 
 fromFileLn :: (PipeClass p, MonadBaseControl IO m,
-	MonadTrans (p i BSC.ByteString),
-	MonadBaseControl IO (p i BSC.ByteString m)) =>
+	MonadTrans (p i BSC.ByteString), Monad (p i BSC.ByteString m)) =>
 	FilePath -> p i BSC.ByteString m ()
 fromFileLn fp =
 	bracket (liftBase $ openFile fp ReadMode) (liftBase . hClose) fromHandleLn
 
 toFileLn :: (PipeClass p, MonadBaseControl IO m,
-	MonadTrans (p BSC.ByteString o),
-	MonadBaseControl IO (p BSC.ByteString o m)) =>
+	MonadTrans (p BSC.ByteString o), Monad (p BSC.ByteString o m)) =>
+--	MonadIO (p BSC.ByteString o m)) =>
 	FilePath -> p BSC.ByteString o m ()
 toFileLn fp = bracket
 	(liftBase $ openFile fp WriteMode)
 	(liftBase . hClose) toHandleLn
 
-fromHandle ::
-	(PipeClass p, Monad m, MonadBaseControl IO (p i BSC.ByteString m)) =>
+fromHandle :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p i BSC.ByteString), Monad (p i BSC.ByteString m)) =>
 	Handle -> p i BSC.ByteString m ()
-fromHandle h = liftBase (BS.hGetSome h bufferSize) >>= yield >> fromHandle h
+fromHandle h = lift (liftBase $ BS.hGetSome h bufferSize) >>= yield >> fromHandle h
 
-toHandle :: (PipeClass p, Monad m, MonadBaseControl IO (p BSC.ByteString o m)) =>
+toHandle :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p BSC.ByteString o), Monad (p BSC.ByteString o m)) =>
 	Handle -> p BSC.ByteString o m ()
-toHandle h = await >>= maybe (return ()) ((>> toHandleLn h) . liftBase . BSC.hPut h)
+toHandle h = await >>= maybe (return ())
+	((>> toHandle h) . lift . liftBase . BSC.hPut h)
diff --git a/src/Data/Pipe/IO.hs b/src/Data/Pipe/IO.hs
--- a/src/Data/Pipe/IO.hs
+++ b/src/Data/Pipe/IO.hs
@@ -12,29 +12,30 @@
 import System.IO
 import GHC.IO.Exception
 
-fromHandle :: (PipeClass p, Monad m, MonadBaseControl IO (p i Char m)) =>
-	Handle -> p i Char m ()
+fromHandle :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p i Char), Monad (p i Char m)) => Handle -> p i Char m ()
 fromHandle h = do
-	mc <- liftBase $ (Just <$> hGetChar h) `catch` \(e :: IOException) ->
+	mc <- lift . liftBase $ (Just <$> hGetChar h) `catch` \(e :: IOException) ->
 		case ioe_type e of
 			EOF -> return Nothing
 			_ -> ioException e
 	maybe (return ()) ((>> fromHandle h) . yield) mc
 
-toHandle :: (PipeClass p, Monad m, MonadBaseControl IO (p Char o m)) =>
-	Handle -> p Char o m ()
-toHandle h = await >>= maybe (return ()) ((>> toHandle h) . liftBase . hPutChar h)
+toHandle :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p Char o), Monad (p Char o m)) => Handle -> p Char o m ()
+toHandle h = await >>= maybe (return ())
+	((>> toHandle h) . lift . liftBase . hPutChar h)
 
 fromFile :: (PipeClass p, MonadBaseControl IO m,
-	MonadTrans (p i Char), MonadBaseControl IO (p i Char m)) =>
-	FilePath -> p i Char m ()
+	MonadTrans (p i Char), Monad (p i Char m)) => FilePath -> p i Char m ()
 fromFile fp =
 	bracket (liftBase $ openFile fp ReadMode) (liftBase . hClose) fromHandle
 
-toFile :: (PipeClass p, MonadIO m, MonadBaseControl IO m,
-	MonadTrans (p Char o), MonadBaseControl IO (p Char o m)) =>
-	FilePath -> p Char o m ()
+toFile :: (PipeClass p, MonadBaseControl IO m,
+	MonadTrans (p Char o), Monad (p Char o m)) => FilePath -> p Char o m ()
 toFile fp = bracket (liftBase $ openFile fp WriteMode) (liftBase . hClose) toHandle
 
-debug :: (PipeClass p, Monad m, MonadBaseControl IO (p a a m), Show a) => p a a m ()
-debug = await >>= maybe (return ()) (\x -> liftBase (print x) >> yield x >> debug)
+debug :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p a a), Monad (p a a m), Show a) => p a a m ()
+debug = await >>= maybe (return ())
+	(\x -> lift (liftBase $ print x) >> yield x >> debug)
diff --git a/src/Data/Pipe/TChan.hs b/src/Data/Pipe/TChan.hs
--- a/src/Data/Pipe/TChan.hs
+++ b/src/Data/Pipe/TChan.hs
@@ -6,15 +6,16 @@
 
 import Control.Applicative
 import "monads-tf" Control.Monad.Trans
-import Control.Monad.Trans.Control
 import Control.Monad.Base
 import Control.Concurrent.STM
 import Data.Pipe
 
-fromTChan :: MonadBaseControl IO m => TChan a -> Pipe () a m ()
+fromTChan :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p x a), Monad (p x a m)) => TChan a -> p x a m ()
 fromTChan c = lift (liftBase . atomically $ readTChan c) >>= yield >> fromTChan c
 
-fromTChans :: MonadBaseControl IO m => [TChan a] -> Pipe () a m ()
+fromTChans :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p x a), Monad (p x a m)) => [TChan a] -> p x a m ()
 fromTChans cs = (>> fromTChans cs) . (yield =<<) . lift . liftBase . atomically $ do
 	readTChans cs >>= maybe retry return
 
@@ -24,6 +25,7 @@
 	e <- isEmptyTChan c
 	if e then readTChans cs else Just <$> readTChan c
 
-toTChan :: MonadBaseControl IO m => TChan a -> Pipe a () m ()
+toTChan :: (PipeClass p, MonadBase IO m,
+	MonadTrans (p a x), Monad (p a x m)) => TChan a -> p a x m ()
 toTChan c = await >>= maybe (return ())
 	((>> toTChan c) . lift . liftBase . atomically . writeTChan c)
