diff --git a/ocaml-export.cabal b/ocaml-export.cabal
--- a/ocaml-export.cabal
+++ b/ocaml-export.cabal
@@ -1,9 +1,11 @@
--- This file has been generated from package.yaml by hpack version 0.17.1.
+-- This file has been generated from package.yaml by hpack version 0.20.0.
 --
 -- see: https://github.com/sol/hpack
+--
+-- hash: 40f5121d1f5a9609c07abe6a6714c0fc77ffb415335597665276c30c9da23d60
 
 name:           ocaml-export
-version:        0.3.0.0
+version:        0.4.0.0
 synopsis:       Convert Haskell types in OCaml types
 description:    README.md
 category:       Web
@@ -26,23 +28,23 @@
       src
   ghc-options: -Wall
   build-depends:
-      base >= 4.7 && < 5
+      QuickCheck
     , aeson
+    , base >=4.7 && <5
     , bytestring
     , containers
     , directory
     , file-embed
     , filepath
     , formatting
-    , hspec-golden-aeson >= 0.4.0.0
+    , hspec-golden-aeson >=0.4.0.0
     , mtl
-    , split
-    , QuickCheck
     , quickcheck-arbitrary-adt
     , servant
     , servant-server
-    , text
+    , split
     , template-haskell
+    , text
     , time
     , typelits-witnesses
     , wl-pprint-text
@@ -68,8 +70,9 @@
       test
   ghc-options: -Wall
   build-depends:
-      base
+      QuickCheck
     , aeson
+    , base
     , bytestring
     , constraints
     , containers
@@ -79,17 +82,16 @@
     , hspec-golden-aeson
     , ocaml-export
     , process
-    , QuickCheck
     , quickcheck-arbitrary-adt
     , servant
     , servant-server
     , template-haskell
     , text
     , time
+    , typelits-witnesses
     , wai
     , wai-extra
     , warp
-    , typelits-witnesses
   other-modules:
       Dependency
       File
@@ -100,4 +102,5 @@
       Sum
       SumApp
       Util
+      Paths_ocaml_export
   default-language: Haskell2010
diff --git a/src/OCaml/BuckleScript/Internal/Module.hs b/src/OCaml/BuckleScript/Internal/Module.hs
--- a/src/OCaml/BuckleScript/Internal/Module.hs
+++ b/src/OCaml/BuckleScript/Internal/Module.hs
@@ -25,6 +25,7 @@
     OCamlModule
   , OCamlSubModule
   , OCamlTypeInFile
+  , HaskellTypeName
 
   , EmbeddedOCamlFiles (..)
 
@@ -95,6 +96,10 @@
 data OCamlTypeInFile a (filePath :: Symbol)
   deriving Typeable
 
+-- | In case Generic is not derived, manually provide the type name
+--   user is responsible for making sure it is correct. otherwise it
+--   may lead to a compile error.
+data HaskellTypeName (name :: Symbol) a
 
 -- ==============================================
 -- Data Types
@@ -127,6 +132,7 @@
 type family (HasOCamlTypeFlag a) :: Nat where
   HasOCamlTypeFlag (OCamlSubModule a :> b) = 4
   HasOCamlTypeFlag (a :> b) = 3
+  HasOCamlTypeFlag (HaskellTypeName a (OCamlTypeInFile b c)) = 2
   HasOCamlTypeFlag (OCamlTypeInFile a b) = 2
   HasOCamlTypeFlag a = 1
 
@@ -148,6 +154,11 @@
   mkInterface' _ Proxy options fileMap = (mkInterface (Proxy :: Proxy a) options fileMap) <> (mkInterface (Proxy :: Proxy b) options fileMap)
   mkSpec' _ Proxy options modules url goldendir fileMap = (mkSpec (Proxy :: Proxy a) options modules url goldendir fileMap) <> (mkSpec (Proxy :: Proxy b) options modules url goldendir fileMap)
 
+instance (HasOCamlType (OCamlTypeInFile a b)) => HasOCamlType' 2 (HaskellTypeName typSymbol (OCamlTypeInFile a b)) where
+  mkType' _ Proxy options interface fileMap = (mkType (Proxy :: Proxy (OCamlTypeInFile a b)) options interface fileMap)
+  mkInterface' _ Proxy options fileMap = (mkInterface (Proxy :: Proxy (OCamlTypeInFile a b)) options fileMap)
+  mkSpec' _ Proxy options modules url goldendir fileMap = (mkSpec (Proxy :: Proxy (OCamlTypeInFile a b)) options modules url goldendir fileMap)
+
 instance (OCamlType a, Typeable a) => HasOCamlType' 2 (OCamlTypeInFile a b) where
   mkType' _ Proxy _options _ fileMap = do
     let typeName = tyConName . typeRepTyCon $ typeRep (Proxy :: Proxy a)
@@ -218,6 +229,9 @@
 
 instance (HasEmbeddedFile' a, HasEmbeddedFile' b) => HasEmbeddedFile' (a :> b) where
   mkFiles' includeInterface includeSpec Proxy = (<>) <$> mkFiles' includeInterface includeSpec (Proxy :: Proxy a) <*> mkFiles' includeInterface includeSpec (Proxy :: Proxy b)
+
+instance (HasEmbeddedFile' (OCamlTypeInFile a b)) => HasEmbeddedFile' (HaskellTypeName typSymbol (OCamlTypeInFile a b)) where
+  mkFiles' includeInterface includeSpec Proxy = mkFiles' includeInterface includeSpec (Proxy :: Proxy (OCamlTypeInFile a b))
 
 instance (Typeable a, KnownSymbol b) => HasEmbeddedFile' (OCamlTypeInFile a b) where
   mkFiles' includeInterface includeSpec Proxy = do
diff --git a/src/OCaml/BuckleScript/Internal/Package.hs b/src/OCaml/BuckleScript/Internal/Package.hs
--- a/src/OCaml/BuckleScript/Internal/Package.hs
+++ b/src/OCaml/BuckleScript/Internal/Package.hs
@@ -229,6 +229,7 @@
 type family (HasOCamlTypeMetaDataFlag a) :: Nat where
   HasOCamlTypeMetaDataFlag (OCamlSubModule a :> b) = 4
   HasOCamlTypeMetaDataFlag (a :> b) = 3
+  HasOCamlTypeMetaDataFlag (HaskellTypeName a (OCamlTypeInFile b c)) = 2
   HasOCamlTypeMetaDataFlag (OCamlTypeInFile a b) = 2
   HasOCamlTypeMetaDataFlag a = 1
 
@@ -248,6 +249,8 @@
 instance (HasOCamlTypeMetaData' a, HasOCamlTypeMetaData' b) => HasOCamlTypeMetaData'' 3 (a :> b) where
   mkOCamlTypeMetaData'' _ modul subModul Proxy = (mkOCamlTypeMetaData' modul subModul (Proxy :: Proxy a)) <> (mkOCamlTypeMetaData' modul subModul (Proxy :: Proxy b))
 
+instance (HasOCamlTypeMetaData' (OCamlTypeInFile a b)) => HasOCamlTypeMetaData'' 2 (HaskellTypeName typName (OCamlTypeInFile a b)) where
+  mkOCamlTypeMetaData'' _ modul subModul Proxy = (mkOCamlTypeMetaData' modul subModul (Proxy :: Proxy (OCamlTypeInFile a b)))
 
 instance (Typeable a) => HasOCamlTypeMetaData'' 2 (OCamlTypeInFile a b) where
   mkOCamlTypeMetaData'' _ modul subModul Proxy =
diff --git a/src/OCaml/BuckleScript/Internal/Spec.hs b/src/OCaml/BuckleScript/Internal/Spec.hs
--- a/src/OCaml/BuckleScript/Internal/Spec.hs
+++ b/src/OCaml/BuckleScript/Internal/Spec.hs
@@ -105,6 +105,7 @@
   HasMkGoldenFilesFlag ((OCamlModule a :> b) :<|> c) = 6
   HasMkGoldenFilesFlag (OCamlModule a :> b) = 5
   HasMkGoldenFilesFlag (OCamlSubModule a :> b) = 4
+  HasMkGoldenFilesFlag (HaskellTypeName a (OCamlTypeInFile b c)) = 3
   HasMkGoldenFilesFlag (OCamlTypeInFile a b) = 3
   HasMkGoldenFilesFlag (a :> b) = 2
   HasMkGoldenFilesFlag a = 1
@@ -126,6 +127,9 @@
 instance (HasMkGoldenFiles a) => HasMkGoldenFiles' 4 (OCamlSubModule subModule :> a) where
   mkGoldenFiles' _ Proxy size fp = mkGoldenFiles (Proxy :: Proxy a) size fp
 
+instance (ToADTArbitrary b, ToJSON b) => HasMkGoldenFiles' 3 (HaskellTypeName a (OCamlTypeInFile b c)) where
+  mkGoldenFiles' _ Proxy size fp = mkGoldenFileForType size (Proxy :: Proxy b) fp
+
 instance (ToADTArbitrary a, ToJSON a) => HasMkGoldenFiles' 3 (OCamlTypeInFile a b) where
   mkGoldenFiles' _ Proxy size fp = mkGoldenFileForType size (Proxy :: Proxy a) fp
 
@@ -151,12 +155,13 @@
 type family MkOCamlSpecAPI' modules subModules api :: * where
   MkOCamlSpecAPI' modules subModules ((OCamlSubModule restSubModules) :> a) = MkOCamlSpecAPI' modules (Append subModules '[restSubModules]) a
   MkOCamlSpecAPI' modules subModules (a :> b) = MkOCamlSpecAPI' modules subModules a :<|> MkOCamlSpecAPI' modules subModules b
-  MkOCamlSpecAPI' modules subModules (OCamlTypeInFile api _typeFilePath) = OCamlSpecAPI modules subModules api
-  MkOCamlSpecAPI' modules subModules api = OCamlSpecAPI modules subModules api
+  MkOCamlSpecAPI' modules subModules (HaskellTypeName name (OCamlTypeInFile api _typeFilePath)) = OCamlSpecAPI modules subModules api ('Just name)
+  MkOCamlSpecAPI' modules subModules (OCamlTypeInFile api _typeFilePath) = OCamlSpecAPI modules subModules api 'Nothing
+  MkOCamlSpecAPI' modules subModules api = OCamlSpecAPI modules subModules api 'Nothing
 
 -- | A servant route for a testing an OCaml type's encoder and decoder
-type OCamlSpecAPI (modules :: [Symbol]) (subModules :: [Symbol]) typ =
-  ConcatSymbols (Insert (TypeName typ) (Append modules subModules)) (ReqBody '[JSON] [typ] :> Post '[JSON] [typ])
+type OCamlSpecAPI (modules :: [Symbol]) (subModules :: [Symbol]) typ (mType :: Maybe Symbol) =
+  ConcatSymbols (Insert mType (TypeName typ) (Append modules subModules)) (ReqBody '[JSON] [typ] :> Post '[JSON] [typ])
 
 class OCamlModuleTypeCount api where
   ocamlModuleTypeCount :: Proxy api -> Int
@@ -235,9 +240,10 @@
   Length (x ': xs) = 1 + Length xs
 
 -- | Insert type into type level list
-type family Insert a xs where
-  Insert a '[]       = a ': '[]
-  Insert a (x ': xs) = x ': (Insert a xs)
+type family Insert a b xs where
+  Insert ('Just a) b '[]       = a ': '[]
+  Insert 'Nothing b '[]       = b ': '[]
+  Insert a b (x ': xs) = x ': (Insert a b xs)
 
 -- | Concat a Symbol the end of a list of Symbols.
 type family ConcatSymbols xs rhs :: * where
diff --git a/src/OCaml/BuckleScript/Types.hs b/src/OCaml/BuckleScript/Types.hs
--- a/src/OCaml/BuckleScript/Types.hs
+++ b/src/OCaml/BuckleScript/Types.hs
@@ -68,7 +68,8 @@
 
 -- aeson
 import Data.Aeson (ToJSON, FromJSON)
-
+-- bytestring
+import Data.ByteString (ByteString)
 -- text
 import Data.Text (Text)
 import qualified Data.Text as T
@@ -284,6 +285,9 @@
   toOCamlType _ = OCamlPrimitive OUnit
 
 instance OCamlType Text where
+  toOCamlType _ = OCamlPrimitive OString
+
+instance OCamlType ByteString where
   toOCamlType _ = OCamlPrimitive OString
 
 instance OCamlType Day where
diff --git a/src/OCaml/Export.hs b/src/OCaml/Export.hs
--- a/src/OCaml/Export.hs
+++ b/src/OCaml/Export.hs
@@ -14,6 +14,7 @@
   , OCamlModule
   , OCamlSubModule
   , OCamlTypeInFile
+  , HaskellTypeName
 
   , PackageOptions (..)
   , defaultPackageOptions
diff --git a/test/File.hs b/test/File.hs
--- a/test/File.hs
+++ b/test/File.hs
@@ -26,6 +26,7 @@
     :> OCamlTypeInFile Business "test/ocaml/Business"
     :> OCamlTypeInFile (Wrapper TypeParameterRef0 TypeParameterRef1) "test/ocaml/Wrapper"
     :> AutoDependingOnManual
+    :> HaskellTypeName "NonGenericType" (OCamlTypeInFile NonGenericType "test/ocaml/NonGenericType")
   )
 
 data Person = Person
@@ -92,3 +93,30 @@
   arbitrary = AutoDependingOnManual <$> arbitrary <*> arbitrary
 
 instance ToADTArbitrary AutoDependingOnManual
+
+data NonGenericType =
+  NonGenericType
+    { ngA :: String
+    , ngB :: Int
+    } deriving (Show, Eq)
+
+instance ToJSON NonGenericType where
+  toJSON ng = object [ "ngA" .= ngA ng, "ngB" .= ngB ng]
+
+instance FromJSON NonGenericType where
+  parseJSON = withObject "NonGenericType" $ \o ->
+    NonGenericType <$> o .: "ngA" <*> o .: "ngB"
+
+instance ToADTArbitrary NonGenericType where
+  toADTArbitrarySingleton Proxy =
+    ADTArbitrarySingleton "File" "NonGenericType"
+      <$> (ConstructorArbitraryPair "NonGenericType" <$> (NonGenericType <$> arbitrary <*> arbitrary))
+
+  toADTArbitrary Proxy =
+    ADTArbitrary "File" "NonGenericType"
+      <$> sequence
+        [ ConstructorArbitraryPair "NonGenericType" <$> (NonGenericType <$> arbitrary <*> arbitrary)
+        ]
+
+instance OCamlType NonGenericType where
+  toOCamlType _ = typeableToOCamlType (Proxy :: Proxy NonGenericType)
