diff --git a/Cloud/AWS/Lib/FromText.hs b/Cloud/AWS/Lib/FromText.hs
--- a/Cloud/AWS/Lib/FromText.hs
+++ b/Cloud/AWS/Lib/FromText.hs
@@ -7,106 +7,7 @@
       )
     , deriveFromText
     , failText
-    -- Re-exports
-    , IPv4
-    , AddrRange
-    , Text
-    , UTCTime
     ) where
 
-import Control.Applicative ((<$>))
-import Control.Monad
-import Data.IP (IPv4, AddrRange)
-import Data.Monoid ((<>))
-import Data.Text (Text)
-import qualified Data.Text as T
-import Data.Time (UTCTime)
-import qualified Data.Time as Time
-import qualified Data.Time.Parse as TP
-import Language.Haskell.TH
-import Safe
-
-class FromText a where
-    fromText :: Monad m => Text -> m a
-
-    fromText' :: Monad m => Text -> m a
-    fromText' name
-        = maybe (failText name) return
-        . fromText
-        $ name
-
-    fromNamedText :: Monad m => Text -> Maybe Text -> m a
-    fromNamedText name
-        = maybe
-            (failText $ T.pack "no text name=" <> name)
-            fromText'
-
-failText :: Monad m => Text -> m a
-failText msg = fail $ "FromText error: " <> T.unpack msg
-
-instance FromText a => FromText (Maybe a) where
-    fromText' = return . join . fromText
-    fromNamedText _name Nothing  = return Nothing
-    fromNamedText _name (Just t) = return $ fromText t
-    fromText = return . fromText
-
-instance FromText Int where
-    fromText = fromTextToRead
-
-instance FromText Integer where
-    fromText = fromTextToRead
-
-instance FromText Double where
-    fromText = fromTextToRead
-
-instance FromText IPv4 where
-    fromText = fromTextToRead
-
-instance FromText (AddrRange IPv4) where
-    fromText = fromTextToRead
-
-fromTextToRead :: (Monad m, Read a) => Text -> m a
-fromTextToRead = readM . T.unpack
-
-readM :: (Monad m, Read a) => String -> m a
-readM a = maybe (fail $ "read failue: " <> a) return $ readMay a
-
-instance FromText Text where
-    fromText t
-        | t == ""   = failText "Text"
-        | otherwise = return t
-
-instance FromText Bool where
-    fromText "true"  = return True
-    fromText "false" = return False
-    fromText _       = failText "Bool"
-
-instance FromText UTCTime where
-    fromText t
-        = maybe
-            (fail "UTCTime")
-            (return . Time.localTimeToUTC Time.utc)
-        $ fst <$> (TP.strptime fmt $ T.unpack t)
-      where
-        fmt = "%FT%T"
-
-instance FromText () where
-    fromText _ = return ()
-    fromNamedText _ = maybe (return ()) fromText
-
-deriveFromText :: String -> [String] -> DecsQ
-deriveFromText dstr strs = do
-    ctrs <- map (\(NormalC name _) -> name) <$> cons
-    x <- newName "x"
-    let cases = caseE (varE x) (map f (zip strs ctrs) ++ [wild])
-    let fun = funD 'fromText [clause [varP x] (normalB cases) []]
-    (:[]) <$> instanceD ctx typ [fun]
-  where
-    d = mkName dstr
-    cons = do
-        (TyConI (DataD _ _ _ cs _)) <- reify d
-        return cs
-    f (s, t) = match (litP $ stringL s) (normalB $ [|return $(conE t)|]) []
-    wild = match wildP (normalB [|fail dstr|]) []
-    typ = appT (conT ''FromText) (conT d)
-    ctx = return []
+import Cloud.AWS.Lib.FromText.Class (FromText(..), failText)
+import Cloud.AWS.Lib.FromText.TH (deriveFromText)
diff --git a/Cloud/AWS/Lib/FromText/Class.hs b/Cloud/AWS/Lib/FromText/Class.hs
new file mode 100644
--- /dev/null
+++ b/Cloud/AWS/Lib/FromText/Class.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE FlexibleInstances #-}
+
+module Cloud.AWS.Lib.FromText.Class
+    where
+
+import Control.Applicative ((<$>))
+import Control.Monad
+import Data.IP (IPv4, AddrRange)
+import Data.Monoid ((<>))
+import Data.Text (Text)
+import qualified Data.Text as T
+import Data.Time (UTCTime)
+import qualified Data.Time as Time
+import qualified Data.Time.Parse as TP
+import Safe
+
+class FromText a where
+    fromText :: Monad m => Text -> m a
+
+    fromText' :: Monad m => Text -> m a
+    fromText' name
+        = maybe (failText name) return
+        . fromText
+        $ name
+
+    fromNamedText :: Monad m => Text -> Maybe Text -> m a
+    fromNamedText name
+        = maybe
+            (failText $ T.pack "no text name=" <> name)
+            fromText'
+
+failText :: Monad m => Text -> m a
+failText msg = fail $ "FromText error: " <> T.unpack msg
+
+instance FromText a => FromText (Maybe a) where
+    fromText' = return . join . fromText
+    fromNamedText _name Nothing  = return Nothing
+    fromNamedText _name (Just t) = return $ fromText t
+    fromText = return . fromText
+
+instance FromText Int where
+    fromText = fromTextToRead
+
+instance FromText Integer where
+    fromText = fromTextToRead
+
+instance FromText Double where
+    fromText = fromTextToRead
+
+instance FromText IPv4 where
+    fromText = fromTextToRead
+
+instance FromText (AddrRange IPv4) where
+    fromText = fromTextToRead
+
+fromTextToRead :: (Monad m, Read a) => Text -> m a
+fromTextToRead = readM . T.unpack
+
+readM :: (Monad m, Read a) => String -> m a
+readM a = maybe (fail $ "read failue: " <> a) return $ readMay a
+
+instance FromText Text where
+    fromText t
+        | t == ""   = failText "Text"
+        | otherwise = return t
+
+instance FromText Bool where
+    fromText "true"  = return True
+    fromText "false" = return False
+    fromText _       = failText "Bool"
+
+instance FromText UTCTime where
+    fromText t
+        = maybe
+            (fail "UTCTime")
+            (return . Time.localTimeToUTC Time.utc)
+        $ fst <$> (TP.strptime fmt $ T.unpack t)
+      where
+        fmt = "%FT%T"
+
+instance FromText () where
+    fromText _ = return ()
+    fromNamedText _ = maybe (return ()) fromText
diff --git a/Cloud/AWS/Lib/FromText/TH.hs b/Cloud/AWS/Lib/FromText/TH.hs
new file mode 100644
--- /dev/null
+++ b/Cloud/AWS/Lib/FromText/TH.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module Cloud.AWS.Lib.FromText.TH
+    where
+
+import Control.Applicative ((<$>))
+import Language.Haskell.TH
+
+import Cloud.AWS.Lib.FromText.Class (FromText(..))
+
+deriveFromText :: String -> [String] -> DecsQ
+deriveFromText dstr strs = do
+    ctrs <- map (\(NormalC name _) -> name) <$> cons
+    x <- newName "x"
+    let cases = caseE (varE x) (map f (zip strs ctrs) ++ [wild])
+    let fun = funD 'fromText [clause [varP x] (normalB cases) []]
+    (:[]) <$> instanceD ctx typ [fun]
+  where
+    d = mkName dstr
+    cons = do
+        (TyConI (DataD _ _ _ cs _)) <- reify d
+        return cs
+    f (s, t) = match (litP $ stringL s) (normalB $ [|return $(conE t)|]) []
+    wild = match wildP (normalB [|fail dstr|]) []
+    typ = appT (conT ''FromText) (conT d)
+    ctx = return []
diff --git a/Cloud/AWS/Lib/ToText.hs b/Cloud/AWS/Lib/ToText.hs
--- a/Cloud/AWS/Lib/ToText.hs
+++ b/Cloud/AWS/Lib/ToText.hs
@@ -1,52 +1,10 @@
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE TemplateHaskell #-}
 
 module Cloud.AWS.Lib.ToText
     ( ToText (toText)
+    , deriveToText
     ) where
 
-import Data.ByteString (ByteString)
-import Data.IP (IPv4, AddrRange)
-import Data.Text (Text)
-import qualified Data.Text as T
-import qualified Data.Text.Encoding as T
-import Data.Time (UTCTime)
-import qualified Data.Time as Time
-import System.Locale (defaultTimeLocale)
-
-class ToText a where
-    toText :: a -> Text
-    toMaybeText :: a -> Maybe Text
-    toMaybeText = Just . toText
-
-instance ToText Text where
-    toText t = t
-
-instance ToText ByteString where
-    toText = T.decodeUtf8
-
-instance ToText Bool where
-    toText True  = "true"
-    toText False = "false"
-
-instance ToText UTCTime where
-    toText
-        = T.pack
-        . Time.formatTime defaultTimeLocale "%FT%T"
-
-instance ToText Int where
-    toText = toTextFromShow
-
-instance ToText Integer where
-    toText = toTextFromShow
-
-instance ToText Double where
-    toText = toTextFromShow
-
-instance ToText IPv4 where
-    toText = toTextFromShow
-
-instance ToText (AddrRange IPv4) where
-    toText = toTextFromShow
-
-toTextFromShow :: Show a => a -> Text
-toTextFromShow = T.pack . show
+import Cloud.AWS.Lib.ToText.Class (ToText(toText))
+import Cloud.AWS.Lib.ToText.TH (deriveToText)
diff --git a/Cloud/AWS/Lib/ToText/Class.hs b/Cloud/AWS/Lib/ToText/Class.hs
new file mode 100644
--- /dev/null
+++ b/Cloud/AWS/Lib/ToText/Class.hs
@@ -0,0 +1,52 @@
+{-# LANGUAGE FlexibleInstances #-}
+
+module Cloud.AWS.Lib.ToText.Class
+    ( ToText (toText)
+    ) where
+
+import Data.ByteString (ByteString)
+import Data.IP (IPv4, AddrRange)
+import Data.Text (Text)
+import qualified Data.Text as T
+import qualified Data.Text.Encoding as T
+import Data.Time (UTCTime)
+import qualified Data.Time as Time
+import System.Locale (defaultTimeLocale)
+
+class ToText a where
+    toText :: a -> Text
+    toMaybeText :: a -> Maybe Text
+    toMaybeText = Just . toText
+
+instance ToText Text where
+    toText t = t
+
+instance ToText ByteString where
+    toText = T.decodeUtf8
+
+instance ToText Bool where
+    toText True  = "true"
+    toText False = "false"
+
+instance ToText UTCTime where
+    toText
+        = T.pack
+        . Time.formatTime defaultTimeLocale "%FT%T"
+
+instance ToText Int where
+    toText = toTextFromShow
+
+instance ToText Integer where
+    toText = toTextFromShow
+
+instance ToText Double where
+    toText = toTextFromShow
+
+instance ToText IPv4 where
+    toText = toTextFromShow
+
+instance ToText (AddrRange IPv4) where
+    toText = toTextFromShow
+
+toTextFromShow :: Show a => a -> Text
+toTextFromShow = T.pack . show
diff --git a/Cloud/AWS/Lib/ToText/TH.hs b/Cloud/AWS/Lib/ToText/TH.hs
new file mode 100644
--- /dev/null
+++ b/Cloud/AWS/Lib/ToText/TH.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module Cloud.AWS.Lib.ToText.TH
+    ( deriveToText
+    ) where
+
+import Control.Applicative
+import Language.Haskell.TH
+
+import Cloud.AWS.Lib.ToText.Class (ToText(..))
+
+deriveToText :: String -> [String] -> DecsQ
+deriveToText name value = do
+    let dname = mkName name
+    (TyConI (DataD _ _ _ cs _)) <- reify dname
+    let clauses = map
+            (\(npq, str) -> clause [npq] (normalB $ stringE str) [])
+            (zip (map (\(NormalC n _) -> conP n []) cs) value)
+    let fun = funD 'toText clauses
+    let typ = appT (conT ''ToText) (conT dname)
+    (:[]) <$> instanceD (return []) typ [fun]
diff --git a/aws-sdk-text-converter.cabal b/aws-sdk-text-converter.cabal
--- a/aws-sdk-text-converter.cabal
+++ b/aws-sdk-text-converter.cabal
@@ -1,5 +1,5 @@
 name:                aws-sdk-text-converter
-version:             0.2.0.0
+version:             0.3
 synopsis:            The text converter for aws-sdk.
 description:         The text converter for aws-sdk.
 license:             BSD3
@@ -14,6 +14,10 @@
 library
   exposed-modules:     Cloud.AWS.Lib.FromText
                      , Cloud.AWS.Lib.ToText
+  other-modules:       Cloud.AWS.Lib.FromText.Class
+                     , Cloud.AWS.Lib.FromText.TH
+                     , Cloud.AWS.Lib.ToText.Class
+                     , Cloud.AWS.Lib.ToText.TH
   ghc-options:         -Wall -fno-warn-unused-do-bind
   default-extensions:  OverloadedStrings
   build-depends:       base == 4.*
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -45,10 +45,7 @@
 
 data A = B | C deriving (Eq, Show)
 
-instance ToText A where
-    toText B = "ab"
-    toText C = "ac"
-
+deriveToText "A" ["ab", "ac"]
 deriveFromText "A" ["ab", "ac"]
 
 instance Arbitrary A where
@@ -66,6 +63,6 @@
         prop "AddrRange IPv4" (prop_class :: AddrRange IPv4 -> Bool)
         prop "Maybe Int" (prop_mclass :: Int -> Bool)
         it "convert Nothing" testNothing
-        prop "deriveFromText" (prop_class :: A -> Bool)
+        prop "deriveFromText/deriveToText" (prop_class :: A -> Bool)
         prop "Unit" (\t -> fromText t == Just ())
         it "convert Nothing to Unit" testConvertNothingToUnit
