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.12
+version:	0.0.0.13
 stability:	Experimental
 author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>
@@ -87,7 +87,7 @@
 source-repository	this
     type:	git
     location:	git://github.com/YoshikuniJujo/simple-pipe.git
-    tag:	simple-pipe-0.0.0.12
+    tag:	simple-pipe-0.0.0.13
 
 library
     hs-source-dirs:	src
diff --git a/src/Data/Pipe/Basic.hs b/src/Data/Pipe/Basic.hs
--- a/src/Data/Pipe/Basic.hs
+++ b/src/Data/Pipe/Basic.hs
@@ -2,5 +2,5 @@
 
 import Data.Pipe
 
-convert :: Monad m => (a -> b) -> Pipe a b m ()
+convert :: (PipeClass p, Monad m, Monad (p a b m)) => (a -> b) -> p a b m ()
 convert f = await >>= maybe (return ()) ((>> convert f) . yield . f)
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
@@ -12,7 +12,8 @@
 
 import qualified Data.ByteString.Char8 as BSC
 
-fromHandleLn :: MonadIO m => Handle -> Pipe () BSC.ByteString m ()
+fromHandleLn :: (PipeClass p, Monad m, MonadIO (p i BSC.ByteString m)) =>
+	Handle -> p i BSC.ByteString m ()
 fromHandleLn h = do
 	ml <- liftIO $ (Just <$> BSC.hGetLine h) `catch` \(e :: IOException) ->
 		case ioe_type e of
@@ -20,15 +21,18 @@
 			_ -> ioException e
 	maybe (return ()) ((>> fromHandleLn h) . yield) ml
 
-toHandleLn :: MonadIO m => Handle -> Pipe BSC.ByteString () m ()
+toHandleLn :: (PipeClass p, Monad m, MonadIO (p BSC.ByteString o m)) =>
+	Handle -> p BSC.ByteString o m ()
 toHandleLn h =
 	await >>= maybe (return ()) ((>> toHandleLn h) . liftIO . BSC.hPutStrLn h)
 
-fromFileLn :: (MonadIO m, MonadBaseControl IO m) =>
-	FilePath -> Pipe () BSC.ByteString m ()
+fromFileLn :: (PipeClass p, MonadIO m, MonadBaseControl IO m,
+	MonadTrans (p i BSC.ByteString), MonadIO (p i BSC.ByteString m)) =>
+	FilePath -> p i BSC.ByteString m ()
 fromFileLn fp =
 	bracket (liftIO $ openFile fp ReadMode) (liftIO . hClose) fromHandleLn
 
-toFileLn :: (MonadIO m, MonadBaseControl IO m) =>
-	FilePath -> Pipe BSC.ByteString () m ()
+toFileLn :: (PipeClass p, MonadIO m, MonadBaseControl IO m,
+	MonadTrans (p BSC.ByteString o), MonadIO (p BSC.ByteString o m)) =>
+	FilePath -> p BSC.ByteString o m ()
 toFileLn fp = bracket (liftIO $ openFile fp WriteMode) (liftIO . hClose) toHandleLn
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
@@ -10,7 +10,8 @@
 import System.IO
 import GHC.IO.Exception
 
-fromHandle :: MonadIO m => Handle -> Pipe () Char m ()
+fromHandle :: (PipeClass p, Monad m, MonadIO (p i Char m)) =>
+	Handle -> p i Char m ()
 fromHandle h = do
 	mc <- liftIO $ (Just <$> hGetChar h) `catch` \(e :: IOException) ->
 		case ioe_type e of
@@ -18,11 +19,14 @@
 			_ -> ioException e
 	maybe (return ()) ((>> fromHandle h) . yield) mc
 
-toHandle :: MonadIO m => Handle -> Pipe Char () m ()
+toHandle :: (PipeClass p, Monad m, MonadIO (p Char o m)) =>
+	Handle -> p Char o m ()
 toHandle h = await >>= maybe (return ()) ((>> toHandle h) . liftIO . hPutChar h)
 
-fromFile :: (MonadIO m, MonadBaseControl IO m) => FilePath -> Pipe () Char m ()
+fromFile :: (PipeClass p, MonadIO m, MonadBaseControl IO m,
+	MonadTrans (p i Char), MonadIO (p i Char m)) => FilePath -> p i Char m ()
 fromFile fp = bracket (liftIO $ openFile fp ReadMode) (liftIO . hClose) fromHandle
 
-toFile :: (MonadIO m, MonadBaseControl IO m) => FilePath -> Pipe Char () m ()
+toFile :: (PipeClass p, MonadIO m, MonadBaseControl IO m,
+	MonadTrans (p Char o), MonadIO (p Char o m)) => FilePath -> p Char o m ()
 toFile fp = bracket (liftIO $ openFile fp WriteMode) (liftIO . hClose) toHandle
