diff --git a/servant-csharp.cabal b/servant-csharp.cabal
--- a/servant-csharp.cabal
+++ b/servant-csharp.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                servant-csharp
-version:             0.0.2.0
+version:             0.0.3.0
 synopsis:            Generate servant client library for C#
 description:         Generate servant client library for C#
 homepage:            https://github.com/cutsea110/servant-csharp.git
diff --git a/src/CS.hs b/src/CS.hs
--- a/src/CS.hs
+++ b/src/CS.hs
@@ -1,5 +1,7 @@
-module CS ( csForAPI
-          , csForAPIWith
+module CS ( apiCsForAPI
+          , apiCsForAPIWith
+          , enumCsForAPI
+          , enumCsForAPIWith
 
           , GenerateCsConfig(..)
           , def
diff --git a/src/CS/JsonDotNet.hs b/src/CS/JsonDotNet.hs
--- a/src/CS/JsonDotNet.hs
+++ b/src/CS/JsonDotNet.hs
@@ -4,8 +4,10 @@
 {-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-module CS.JsonDotNet ( csForAPI
-                     , csForAPIWith
+module CS.JsonDotNet ( apiCsForAPI
+                     , apiCsForAPIWith
+                     , enumCsForAPI
+                     , enumCsForAPIWith
 
                      , GenerateCsConfig(..)
                      , def
@@ -30,21 +32,50 @@
 
 data GenerateCsConfig
     = GenerateCsConfig { namespace :: String
-                       , template ::  forall api.
-                                      (HasForeign CSharp Text api,
-                                       GenerateList Text (Foreign Text api))
-                                      => GenerateCsConfig
-                                          -> Proxy api
-                                          -> IO String
+                       , apitemplate ::  forall api.
+                                         (HasForeign CSharp Text api,
+                                          GenerateList Text (Foreign Text api))
+                                         => GenerateCsConfig
+                                     -> Proxy api
+                                     -> IO String
+                       , enumtemplate :: GenerateCsConfig -> IO String
                        , sources :: [FilePath]
                        }
 
 def :: GenerateCsConfig
 def = GenerateCsConfig { namespace = "ServantClientAPI"
-                       , template = defTemplate
+                       , apitemplate = defAPITemplate
+                       , enumtemplate = defEnumTemplate
                        , sources = []
                        }
 
+--------------------------------------------------------------------------
+isEnumLikeDataDecl :: Decl -> Bool
+isEnumLikeDataDecl (DataDecl _ DataType _ _ _ xs _)
+    = all isEnumLikeConDecl xs
+isEnumLikeDataDecl _ = False
+
+isEnumLikeConDecl :: QualConDecl -> Bool
+isEnumLikeConDecl (QualConDecl _ _ _ (ConDecl _ [])) = True
+isEnumLikeConDecl _ = False
+
+enumTypesFromFiles :: [FilePath] -> IO [(String, [String])]
+enumTypesFromFiles hss
+    = return . concat =<< mapM enumTypesFromFile hss
+
+enumTypesFromFile :: FilePath -> IO [(String, [String])]
+enumTypesFromFile hs = do
+  ParseOk (Module _ _ _ _ _ _ decls) <- parseFile hs
+  let xs = filter isEnumLikeDataDecl decls
+  return $ map toTuple xs
+    where
+      conName :: QualConDecl -> String
+      conName (QualConDecl _ _ _ (ConDecl (Ident name) [])) = name
+      conName _ = error "invalid enum type"
+      toTuple (DataDecl _ _ _ (Ident name) _ xs _)
+              = (name, map conName xs)
+
+--------------------------------------------------------------------------
 -- | TODO : more typeable
 isNewtypeDecl :: Decl -> Bool
 isNewtypeDecl (DataDecl _ NewType _ _ _ _ _) = True
@@ -71,6 +102,8 @@
     where
       toTuple (DataDecl _ NewType _ (Ident name) _ [qcon] _)
               = (name, origType qcon)
+
+--------------------------------------------------------------------------
 retType :: Req Text -> String
 retType = T.unpack . fromJust . view reqReturnType
 
@@ -148,20 +181,26 @@
 requestBodyExists :: Req Text -> Bool
 requestBodyExists = not . null . rqBody
 
-csForAPI :: (HasForeign CSharp Text api,
+apiCsForAPI :: (HasForeign CSharp Text api,
              GenerateList Text (Foreign Text api)) =>
             Proxy api -> IO String
-csForAPI = csForAPIWith def
+apiCsForAPI = apiCsForAPIWith def
 
-csForAPIWith :: (HasForeign CSharp Text api,
+apiCsForAPIWith :: (HasForeign CSharp Text api,
                  GenerateList Text (Foreign Text api)) =>
                 GenerateCsConfig -> Proxy api -> IO String
-csForAPIWith conf api = (template conf) conf api
+apiCsForAPIWith conf api = (apitemplate conf) conf api
 
-defTemplate :: (HasForeign CSharp Text api,
+enumCsForAPI :: IO String
+enumCsForAPI = enumCsForAPIWith def
+
+enumCsForAPIWith :: GenerateCsConfig -> IO String
+enumCsForAPIWith conf = (enumtemplate conf) conf
+
+defAPITemplate :: (HasForeign CSharp Text api,
                 GenerateList Text (Foreign Text api)) =>
                GenerateCsConfig -> Proxy api -> IO String
-defTemplate conf api = do
+defAPITemplate conf api = do
   usingAliases <- usingAliasesFromFiles $ sources conf
   return [heredoc|/* generated by servant-csharp */
 using Newtonsoft.Json;
@@ -253,3 +292,20 @@
     }
 }
 |]
+
+defEnumTemplate conf = do
+  es <- enumTypesFromFiles $ sources conf
+  return [heredoc|/* generated by servant-csharp */
+namespace ${namespace conf}
+{
+    $forall (name, cs) <- es
+      #region ${name}
+      public enum ${name}
+      {
+          $forall c <- cs
+            ${c},
+      }
+      #endregion
+}
+|]
+
