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.9
+version:	0.0.0.10
 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.9
+    tag:	simple-pipe-0.0.0.10
 
 library
     hs-source-dirs:	src
diff --git a/src/Data/Pipe.hs b/src/Data/Pipe.hs
--- a/src/Data/Pipe.hs
+++ b/src/Data/Pipe.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleContexts, RankNTypes, PackageImports #-}
+{-# LANGUAGE TypeFamilies, FlexibleContexts, RankNTypes, PackageImports #-}
 
 module Data.Pipe ( PipeClass(..), Pipe, finally, bracket ) where
 
@@ -7,6 +7,7 @@
 import Control.Exception.Lifted (onException)
 import Control.Monad.Trans.Control
 import "monads-tf" Control.Monad.Trans
+import "monads-tf" Control.Monad.Error
 
 class PipeClass p where
 	runPipe :: Monad m => p i o m r -> m (Maybe r)
@@ -25,6 +26,15 @@
 	| Need (m ()) (Maybe i -> Pipe i o m r)
 	| Done (m ()) r
 	| Make (m ()) (m (Pipe i o m r))
+
+instance MonadError m => MonadError (Pipe i o m) where
+	type ErrorType (Pipe i o m) = ErrorType m
+	throwError e = Make (return ()) $ throwError e
+	Ready f o p `catchError` c = Ready f o $ p `catchError` c
+	Need f p `catchError` c = Need f $ \mi -> p mi `catchError` c
+	Done f r `catchError` _ = Done f r
+	Make f p `catchError` c =
+		Make f . ((`catchError` c) `liftM`) $ p `catchError` (return . c)
 
 finalizer :: Pipe i o m r -> m ()
 finalizer (Ready f _ _) = f
