diff --git a/png-chunk-yaftee.cabal b/png-chunk-yaftee.cabal
--- a/png-chunk-yaftee.cabal
+++ b/png-chunk-yaftee.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           png-chunk-yaftee
-version:        0.1.0.0
+version:        0.1.0.1
 synopsis:       PNG's chunk codec on Yaftee
 description:    Please see the README on GitHub at <https://github.com/YoshikuniJujo/png-chunk-yaftee#readme>
 category:       Codec,Graphics,Image
diff --git a/src/Control/Monad/Yaftee/Pipe/Png/Chunk.hs b/src/Control/Monad/Yaftee/Pipe/Png/Chunk.hs
--- a/src/Control/Monad/Yaftee/Pipe/Png/Chunk.hs
+++ b/src/Control/Monad/Yaftee/Pipe/Png/Chunk.hs
@@ -3,7 +3,7 @@
 {-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
 {-# LANGUAGE RequiredTypeArguments #-}
 {-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DataKinds, ConstraintKinds #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
@@ -16,11 +16,11 @@
 
 	-- * DECODE
 
-	decode, hDecode, decodeRun_, DecodeStates,
+	decodeRun_, DecodeStates, decode, hDecode, DecodeMembers,
 
 	-- * ENCODE
 
-	encode, hEncode, encodeRun_, EncodeStates
+	encodeRun_, EncodeStates, encode, hEncode, EncodeMembers
 
 	) where
 
@@ -53,10 +53,17 @@
 
 import Numeric
 
+decodeRun_ ::
+	F.Loose (U.U es) =>
+	Eff.E (DecodeStates nm `Append` es) i o r -> Eff.E es i o ()
+decodeRun_ = void . (`State.runN` Crc32.initial)
 
+type DecodeStates nm = '[State.Named nm Crc32.C]
+
+
 decode :: forall nm -> (
-	U.Member Pipe.P es, OnDemand.Members nm es,
-	U.Member (State.Named nm Crc32.C) es, U.Member (Except.E String) es ) =>
+	U.Member Pipe.P es, DecodeMembers nm es,
+	U.Member (Except.E String) es ) =>
 	Int -> Eff.E es BSF.ByteString C ()
 decode nm n = void $ OnDemand.onDemand nm Pipe.=$= PipeCrc32.crc32 nm Pipe.=$= do
 	State.putN nm $ OnDemand.RequestBytes 8
@@ -66,15 +73,18 @@
 	chunks nm n
 
 hDecode :: forall nm -> (
-	U.Member Pipe.P es, OnDemand.Members nm es,
-	U.Member (State.Named nm Crc32.C) es, U.Member (Except.E String) es,
-	U.Base IO.I es ) =>
+	U.Member Pipe.P es, DecodeMembers nm es,
+	U.Member (Except.E String) es, U.Base IO.I es ) =>
 	Handle -> Int -> Int -> Eff.E es BSF.ByteString C ()
 hDecode nm h n n' = void $
 	PipeBS.hGet n h Pipe.=$=
 	PipeT.convert BSF.fromStrict Pipe.=$=
 	decode nm n'
 
+type DecodeMembers nm es = (
+	OnDemand.Members nm es,
+	U.Member (State.Named nm Crc32.C) es )
+
 chunks :: forall nm -> (
 	U.Member Pipe.P es, OnDemand.Members nm es,
 	U.Member (State.Named nm Crc32.C) es, U.Member (Except.E String) es ) =>
@@ -113,13 +123,6 @@
 		0 -> []
 		m | n < m -> n : go (m - n) | otherwise -> [m]
 
-decodeRun_ ::
-	F.Loose (U.U es) =>
-	Eff.E (DecodeStates nm `Append` es) i o r -> Eff.E es i o ()
-decodeRun_ = void . (`State.runN` Crc32.initial)
-
-type DecodeStates nm = '[State.Named nm Crc32.C]
-
 data C	= Begin Int BSF.ByteString
 	| Body BSF.ByteString | End
 	| EndOfTheWorld
@@ -183,10 +186,14 @@
 	Pipe.yield . BSF.fromBitsBE' $ Crc32.toWord c
 	pure $ cn /= "IEND"
 
+type EncodeMembers nm es = (
+	U.Member (State.Named nm Crc32.C) es
+	)
+
 encodeRun_ :: forall nm es i o r .
 	F.Loose (U.U es) =>
 	Eff.E (EncodeStates nm `Append` es) i o r ->
 	Eff.E es i o ()
-encodeRun_ = void . OnDemand.run @nm . PipeCrc32.run @nm
+encodeRun_ = void . PipeCrc32.run @nm
 
-type EncodeStates nm = State.Named nm Crc32.C ': OnDemand.States nm
+type EncodeStates nm = '[State.Named nm Crc32.C]
