diff --git a/names-th.cabal b/names-th.cabal
--- a/names-th.cabal
+++ b/names-th.cabal
@@ -1,5 +1,5 @@
 name:                names-th
-version:             0.1.0.0
+version:             0.1.0.1
 synopsis:            Manipulate name strings for TH
 description:         This package includes functions to manipulate name string
                      and extra library functions for Template Haskell.
@@ -17,7 +17,7 @@
   exposed-modules:
                      Language.Haskell.TH.Name.CamelCase
                      Language.Haskell.TH.Lib.Extra
-  build-depends:       base <5, template-haskell
+  build-depends:       base <5, containers, template-haskell
   hs-source-dirs:    src
   ghc-options:       -Wall
 
diff --git a/src/Language/Haskell/TH/Name/CamelCase.hs b/src/Language/Haskell/TH/Name/CamelCase.hs
--- a/src/Language/Haskell/TH/Name/CamelCase.hs
+++ b/src/Language/Haskell/TH/Name/CamelCase.hs
@@ -28,6 +28,7 @@
   ) where
 
 import Data.Char (toUpper, toLower)
+import Data.Set (Set, fromList, member)
 import Language.Haskell.TH
   (Name, mkName, TypeQ, conT, ExpQ, conE, varE, PatQ, varP)
 
@@ -39,6 +40,21 @@
 unCapitalize (c:cs) = toLower c : cs
 unCapitalize ""     = ""
 
+-- | rename the string that equals to reserved identifiers.
+rename :: String -> String
+rename cs | cs `member` reservedIds = cs ++ "_"
+          | otherwise = cs
+{-# INLINE rename #-}
+
+-- | All reserved identifiers. Taken from section 2.4 of the 2010 Report.
+reservedIds :: Set String
+reservedIds = fromList [ "case", "class", "data", "default", "deriving"
+                       , "do", "else", "foreign", "if", "import", "in"
+                       , "infix", "infixl", "infixr", "instance", "let"
+                       , "module", "newtype", "of", "then", "type", "where"
+                       , "_" ]
+{-# INLINE reservedIds #-}
+
 {- $nameTypes
 Wrap 'Name' to distinguish constructor names and variable names.
 -}
@@ -48,14 +64,14 @@
 
 -- | Make constructor name from 'String'.
 toConName :: String -> ConName
-toConName =  ConName . mkName . capitalize
+toConName =  ConName . mkName . rename . capitalize
 
 -- | Type to wrap variable\'s 'Name'.
 newtype VarName = VarName { varName :: Name {- ^ Get wrapped 'Name' -} }
 
 -- | Make variable name from 'String'.
 toVarName :: String -> VarName
-toVarName =  VarName . mkName . unCapitalize
+toVarName =  VarName . mkName . rename . unCapitalize
 
 -- | 'Char' set used from camel-cased names.
 nameChars :: String
