diff --git a/handle-like.cabal b/handle-like.cabal
--- a/handle-like.cabal
+++ b/handle-like.cabal
@@ -2,7 +2,7 @@
 build-type:	Simple
 
 name:		handle-like
-version:	0.0.0.0
+version:	0.0.0.1
 stability:	Experimental
 author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>
@@ -30,7 +30,7 @@
 source-repository	this
     type:	git
     location:	git://github.com/YoshikuniJujo/forest
-    tag:	handle-like-0.0.0.0
+    tag:	handle-like-0.0.0.1
 
 library
     hs-source-dirs:	src
diff --git a/src/Data/HandleLike.hs b/src/Data/HandleLike.hs
--- a/src/Data/HandleLike.hs
+++ b/src/Data/HandleLike.hs
@@ -1,38 +1,40 @@
-{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE OverloadedStrings, TypeFamilies, FlexibleContexts #-}
 
 module Data.HandleLike (HandleLike(..), hlPutStrLn) where
 
-import Control.Applicative
+import Control.Monad
 import Data.Word
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Char8 as BSC
 import System.IO
 
-class HandleLike h where
-	hlPut :: h -> BS.ByteString -> IO ()
-	hlGet :: h -> Int -> IO BS.ByteString
-	hlGetByte :: h -> IO Word8
-	hlGetLine :: h -> IO BS.ByteString
-	hlGetContent :: h -> IO BS.ByteString
-	hlClose :: h -> IO ()
+class Monad (HandleMonad h) => HandleLike h where
+	type HandleMonad h
+	hlPut :: h -> BS.ByteString -> HandleMonad h ()
+	hlGet :: h -> Int -> HandleMonad h BS.ByteString
+	hlGetByte :: h -> HandleMonad h Word8
+	hlGetLine :: h -> HandleMonad h BS.ByteString
+	hlGetContent :: h -> HandleMonad h BS.ByteString
+	hlClose :: h -> HandleMonad h ()
 
-	hlGetByte h = do [b] <- BS.unpack <$> hlGet h 1; return b
+	hlGetByte h = do [b] <- BS.unpack `liftM` hlGet h 1; return b
 	hlGetLine h = do
 		b <- hlGetByte h
 		case b of
 			10 -> return ""
-			_ -> BS.cons b <$> hlGetLine h
+			_ -> BS.cons b `liftM` hlGetLine h
 	hlGetContent = flip hlGet 1
 
 instance HandleLike Handle where
+	type HandleMonad Handle = IO
 	hlPut = BS.hPut
 	hlGet = BS.hGet
 --	hlGetByte h = do [b] <- BS.unpack <$> BS.hGet h 1; return b
-	hlGetLine = (chopCR <$>) . BS.hGetLine
+	hlGetLine = (chopCR `liftM`) . BS.hGetLine
 --	hlGetContent = flip BS.hGet 1
 	hlClose = hClose
 
-hlPutStrLn :: HandleLike h => h -> BS.ByteString -> IO ()
+hlPutStrLn :: HandleLike h => h -> BS.ByteString -> HandleMonad h ()
 hlPutStrLn h = hlPut h . (`BS.append` "\n")
 
 chopCR :: BS.ByteString -> BS.ByteString
