diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -48,11 +48,6 @@
 
 * Model Inheritance
 
-* Default Parameter Values
-
-* Enum Parameters
-
-
 This is beta software; other cases may not be supported.
 
 ### Codegen "additional properties" parameters
@@ -67,6 +62,7 @@
 | allowToJsonNulls                | allow emitting JSON Null during model encoding to JSON                                                                        | false    | false                |
 | dateFormat                      | format string used to parse/render a date                                                                                     | %Y-%m-%d | %Y-%m-%d                      |
 | dateTimeFormat                  | format string used to parse/render a datetime. (Defaults to [formatISO8601Millis][1] when not provided)                       |          |                   |
+| generateEnums                   | Generate specific datatypes for swagger enums                                                                                 | true     | true |
 | generateFormUrlEncodedInstances | Generate FromForm/ToForm instances for models used by x-www-form-urlencoded operations (model fields must be primitive types) | true     | true |
 | generateLenses                  | Generate Lens optics for Models                                                                                               | true     | true                  |
 | generateModelConstructors       | Generate smart constructors (only supply required fields) for models                                                          | true     | true       |
diff --git a/lib/SwaggerPetstore/API.hs b/lib/SwaggerPetstore/API.hs
--- a/lib/SwaggerPetstore/API.hs
+++ b/lib/SwaggerPetstore/API.hs
@@ -359,6 +359,32 @@
 instance Produces TestEnumParameters MimeAny
 
 
+-- *** testInlineAdditionalProperties
+
+-- | @POST \/fake\/inline-additionalProperties@
+-- 
+-- test inline additionalProperties
+-- 
+-- 
+-- 
+testInlineAdditionalProperties 
+  :: (Consumes TestInlineAdditionalProperties contentType, MimeRender contentType A.Value)
+  => contentType -- ^ request content-type ('MimeType')
+  -> A.Value -- ^ "param" -  request body
+  -> SwaggerPetstoreRequest TestInlineAdditionalProperties contentType NoContent
+testInlineAdditionalProperties _ param =
+  _mkRequest "POST" ["/fake/inline-additionalProperties"]
+    `setBodyParam` param
+
+data TestInlineAdditionalProperties 
+
+-- | /Body Param/ "param" - request body
+instance HasBodyParam TestInlineAdditionalProperties A.Value 
+
+-- | @application/json@
+instance Consumes TestInlineAdditionalProperties MimeJSON
+
+
 -- *** testJsonFormData
 
 -- | @GET \/fake\/jsonFormData@
@@ -990,14 +1016,14 @@
 newtype Body = Body { unBody :: [User] } deriving (P.Eq, P.Show, A.ToJSON)
 newtype Byte = Byte { unByte :: ByteArray } deriving (P.Eq, P.Show)
 newtype Callback = Callback { unCallback :: Text } deriving (P.Eq, P.Show)
-newtype EnumFormString = EnumFormString { unEnumFormString :: Text } deriving (P.Eq, P.Show)
-newtype EnumFormStringArray = EnumFormStringArray { unEnumFormStringArray :: [Text] } deriving (P.Eq, P.Show)
-newtype EnumHeaderString = EnumHeaderString { unEnumHeaderString :: Text } deriving (P.Eq, P.Show)
-newtype EnumHeaderStringArray = EnumHeaderStringArray { unEnumHeaderStringArray :: [Text] } deriving (P.Eq, P.Show)
-newtype EnumQueryDouble = EnumQueryDouble { unEnumQueryDouble :: Double } deriving (P.Eq, P.Show)
-newtype EnumQueryInteger = EnumQueryInteger { unEnumQueryInteger :: Int } deriving (P.Eq, P.Show)
-newtype EnumQueryString = EnumQueryString { unEnumQueryString :: Text } deriving (P.Eq, P.Show)
-newtype EnumQueryStringArray = EnumQueryStringArray { unEnumQueryStringArray :: [Text] } deriving (P.Eq, P.Show)
+newtype EnumFormString = EnumFormString { unEnumFormString :: E'EnumFormString } deriving (P.Eq, P.Show)
+newtype EnumFormStringArray = EnumFormStringArray { unEnumFormStringArray :: [E'Inner2] } deriving (P.Eq, P.Show)
+newtype EnumHeaderString = EnumHeaderString { unEnumHeaderString :: E'EnumFormString } deriving (P.Eq, P.Show)
+newtype EnumHeaderStringArray = EnumHeaderStringArray { unEnumHeaderStringArray :: [E'Inner2] } deriving (P.Eq, P.Show)
+newtype EnumQueryDouble = EnumQueryDouble { unEnumQueryDouble :: E'EnumNumber } deriving (P.Eq, P.Show)
+newtype EnumQueryInteger = EnumQueryInteger { unEnumQueryInteger :: E'EnumQueryInteger } deriving (P.Eq, P.Show)
+newtype EnumQueryString = EnumQueryString { unEnumQueryString :: E'EnumFormString } deriving (P.Eq, P.Show)
+newtype EnumQueryStringArray = EnumQueryStringArray { unEnumQueryStringArray :: [E'Inner2] } deriving (P.Eq, P.Show)
 newtype File = File { unFile :: FilePath } deriving (P.Eq, P.Show)
 newtype Int32 = Int32 { unInt32 :: Int } deriving (P.Eq, P.Show)
 newtype Int64 = Int64 { unInt64 :: Integer } deriving (P.Eq, P.Show)
@@ -1017,7 +1043,7 @@
 newtype Password = Password { unPassword :: Text } deriving (P.Eq, P.Show)
 newtype PatternWithoutDelimiter = PatternWithoutDelimiter { unPatternWithoutDelimiter :: Text } deriving (P.Eq, P.Show)
 newtype PetId = PetId { unPetId :: Integer } deriving (P.Eq, P.Show)
-newtype Status = Status { unStatus :: [Text] } deriving (P.Eq, P.Show)
+newtype Status = Status { unStatus :: [E'Status2] } deriving (P.Eq, P.Show)
 newtype StatusText = StatusText { unStatusText :: Text } deriving (P.Eq, P.Show)
 newtype Tags = Tags { unTags :: [Text] } deriving (P.Eq, P.Show)
 newtype Username = Username { unUsername :: Text } deriving (P.Eq, P.Show)
diff --git a/lib/SwaggerPetstore/Model.hs b/lib/SwaggerPetstore/Model.hs
--- a/lib/SwaggerPetstore/Model.hs
+++ b/lib/SwaggerPetstore/Model.hs
@@ -18,6 +18,8 @@
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE DeriveTraversable #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
@@ -28,9 +30,11 @@
 module SwaggerPetstore.Model where
 
 import SwaggerPetstore.Core
+import SwaggerPetstore.MimeTypes
 
 import Data.Aeson ((.:),(.:!),(.:?),(.=))
 
+import qualified Control.Arrow as P (left)
 import qualified Data.Aeson as A
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as BL
@@ -49,7 +53,7 @@
 import Control.Applicative ((<|>))
 import Control.Applicative (Alternative)
 import Data.Text (Text)
-import Prelude (($), (.),(<$>),(<*>),(>>=),Maybe(..),Bool(..),Char,Double,FilePath,Float,Int,Integer,String,fmap,undefined,mempty,maybe,pure,Monad,Applicative,Functor)
+import Prelude (($), (.),(<$>),(<*>),(>>=),(=<<),Maybe(..),Bool(..),Char,Double,FilePath,Float,Int,Integer,String,fmap,undefined,mempty,maybe,pure,Monad,Applicative,Functor)
 
 import qualified Prelude as P
 
@@ -90,7 +94,6 @@
   , additionalPropertiesClassMapOfMapProperty = Nothing
   }
 
-
 -- ** Animal
 -- | Animal
 data Animal = Animal
@@ -124,7 +127,6 @@
   , animalColor = Nothing
   }
 
-
 -- ** AnimalFarm
 -- | AnimalFarm
 data AnimalFarm = AnimalFarm
@@ -153,7 +155,6 @@
   { 
   }
 
-
 -- ** ApiResponse
 -- | ApiResponse
 data ApiResponse = ApiResponse
@@ -190,7 +191,6 @@
   , apiResponseMessage = Nothing
   }
 
-
 -- ** ArrayOfArrayOfNumberOnly
 -- | ArrayOfArrayOfNumberOnly
 data ArrayOfArrayOfNumberOnly = ArrayOfArrayOfNumberOnly
@@ -219,7 +219,6 @@
   { arrayOfArrayOfNumberOnlyArrayArrayNumber = Nothing
   }
 
-
 -- ** ArrayOfNumberOnly
 -- | ArrayOfNumberOnly
 data ArrayOfNumberOnly = ArrayOfNumberOnly
@@ -248,7 +247,6 @@
   { arrayOfNumberOnlyArrayNumber = Nothing
   }
 
-
 -- ** ArrayTest
 -- | ArrayTest
 data ArrayTest = ArrayTest
@@ -285,7 +283,6 @@
   , arrayTestArrayArrayOfModel = Nothing
   }
 
-
 -- ** Capitalization
 -- | Capitalization
 data Capitalization = Capitalization
@@ -334,7 +331,6 @@
   , capitalizationAttName = Nothing
   }
 
-
 -- ** Category
 -- | Category
 data Category = Category
@@ -367,7 +363,6 @@
   , categoryName = Nothing
   }
 
-
 -- ** ClassModel
 -- | ClassModel
 -- Model for testing model with \"_class\" property
@@ -397,7 +392,6 @@
   { classModelClass = Nothing
   }
 
-
 -- ** Client
 -- | Client
 data Client = Client
@@ -426,12 +420,11 @@
   { clientClient = Nothing
   }
 
-
 -- ** EnumArrays
 -- | EnumArrays
 data EnumArrays = EnumArrays
-  { enumArraysJustSymbol :: !(Maybe Text) -- ^ "just_symbol"
-  , enumArraysArrayEnum :: !(Maybe [Text]) -- ^ "array_enum"
+  { enumArraysJustSymbol :: !(Maybe E'JustSymbol) -- ^ "just_symbol"
+  , enumArraysArrayEnum :: !(Maybe [E'ArrayEnum]) -- ^ "array_enum"
   } deriving (P.Show, P.Eq, P.Typeable)
 
 -- | FromJSON EnumArrays
@@ -459,42 +452,12 @@
   , enumArraysArrayEnum = Nothing
   }
 
-
--- ** EnumClass
--- | EnumClass
-data EnumClass = EnumClass
-  { 
-  } deriving (P.Show, P.Eq, P.Typeable)
-
--- | FromJSON EnumClass
-instance A.FromJSON EnumClass where
-  parseJSON = A.withObject "EnumClass" $ \o ->
-    pure EnumClass
-      
-
--- | ToJSON EnumClass
-instance A.ToJSON EnumClass where
-  toJSON EnumClass  =
-   _omitNulls
-      [ 
-      ]
-
-
--- | Construct a value of type 'EnumClass' (by applying it's required fields, if any)
-mkEnumClass
-  :: EnumClass
-mkEnumClass =
-  EnumClass
-  { 
-  }
-
-
 -- ** EnumTest
 -- | EnumTest
 data EnumTest = EnumTest
-  { enumTestEnumString :: !(Maybe Text) -- ^ "enum_string"
-  , enumTestEnumInteger :: !(Maybe Int) -- ^ "enum_integer"
-  , enumTestEnumNumber :: !(Maybe Double) -- ^ "enum_number"
+  { enumTestEnumString :: !(Maybe E'EnumString) -- ^ "enum_string"
+  , enumTestEnumInteger :: !(Maybe E'EnumInteger) -- ^ "enum_integer"
+  , enumTestEnumNumber :: !(Maybe E'EnumNumber) -- ^ "enum_number"
   , enumTestOuterEnum :: !(Maybe OuterEnum) -- ^ "outerEnum"
   } deriving (P.Show, P.Eq, P.Typeable)
 
@@ -529,7 +492,6 @@
   , enumTestOuterEnum = Nothing
   }
 
-
 -- ** FormatTest
 -- | FormatTest
 data FormatTest = FormatTest
@@ -610,7 +572,6 @@
   , formatTestPassword
   }
 
-
 -- ** HasOnlyReadOnly
 -- | HasOnlyReadOnly
 data HasOnlyReadOnly = HasOnlyReadOnly
@@ -643,12 +604,11 @@
   , hasOnlyReadOnlyFoo = Nothing
   }
 
-
 -- ** MapTest
 -- | MapTest
 data MapTest = MapTest
   { mapTestMapMapOfString :: !(Maybe (Map.Map String (Map.Map String Text))) -- ^ "map_map_of_string"
-  , mapTestMapOfEnumString :: !(Maybe (Map.Map String Text)) -- ^ "map_of_enum_string"
+  , mapTestMapOfEnumString :: !(Maybe (Map.Map String E'Inner)) -- ^ "map_of_enum_string"
   } deriving (P.Show, P.Eq, P.Typeable)
 
 -- | FromJSON MapTest
@@ -676,7 +636,6 @@
   , mapTestMapOfEnumString = Nothing
   }
 
-
 -- ** MixedPropertiesAndAdditionalPropertiesClass
 -- | MixedPropertiesAndAdditionalPropertiesClass
 data MixedPropertiesAndAdditionalPropertiesClass = MixedPropertiesAndAdditionalPropertiesClass
@@ -713,7 +672,6 @@
   , mixedPropertiesAndAdditionalPropertiesClassMap = Nothing
   }
 
-
 -- ** Model200Response
 -- | Model200Response
 -- Model for testing model name starting with number
@@ -747,7 +705,6 @@
   , model200ResponseClass = Nothing
   }
 
-
 -- ** ModelList
 -- | ModelList
 data ModelList = ModelList
@@ -776,7 +733,6 @@
   { modelList123List = Nothing
   }
 
-
 -- ** ModelReturn
 -- | ModelReturn
 -- Model for testing reserved words
@@ -806,7 +762,6 @@
   { modelReturnReturn = Nothing
   }
 
-
 -- ** Name
 -- | Name
 -- Model for testing model name same as property name
@@ -849,7 +804,6 @@
   , name123Number = Nothing
   }
 
-
 -- ** NumberOnly
 -- | NumberOnly
 data NumberOnly = NumberOnly
@@ -878,7 +832,6 @@
   { numberOnlyJustNumber = Nothing
   }
 
-
 -- ** Order
 -- | Order
 data Order = Order
@@ -886,7 +839,7 @@
   , orderPetId :: !(Maybe Integer) -- ^ "petId"
   , orderQuantity :: !(Maybe Int) -- ^ "quantity"
   , orderShipDate :: !(Maybe DateTime) -- ^ "shipDate"
-  , orderStatus :: !(Maybe Text) -- ^ "status" - Order Status
+  , orderStatus :: !(Maybe E'Status) -- ^ "status" - Order Status
   , orderComplete :: !(Maybe Bool) -- ^ "complete"
   } deriving (P.Show, P.Eq, P.Typeable)
 
@@ -927,7 +880,6 @@
   , orderComplete = Nothing
   }
 
-
 -- ** OuterBoolean
 -- | OuterBoolean
 newtype OuterBoolean = OuterBoolean
@@ -935,7 +887,6 @@
   } deriving (P.Eq, P.Show, P.Typeable, A.ToJSON, A.FromJSON, WH.ToHttpApiData, WH.FromHttpApiData)
 
 
-
 -- ** OuterComposite
 -- | OuterComposite
 data OuterComposite = OuterComposite
@@ -972,36 +923,6 @@
   , outerCompositeMyBoolean = Nothing
   }
 
-
--- ** OuterEnum
--- | OuterEnum
-data OuterEnum = OuterEnum
-  { 
-  } deriving (P.Show, P.Eq, P.Typeable)
-
--- | FromJSON OuterEnum
-instance A.FromJSON OuterEnum where
-  parseJSON = A.withObject "OuterEnum" $ \o ->
-    pure OuterEnum
-      
-
--- | ToJSON OuterEnum
-instance A.ToJSON OuterEnum where
-  toJSON OuterEnum  =
-   _omitNulls
-      [ 
-      ]
-
-
--- | Construct a value of type 'OuterEnum' (by applying it's required fields, if any)
-mkOuterEnum
-  :: OuterEnum
-mkOuterEnum =
-  OuterEnum
-  { 
-  }
-
-
 -- ** OuterNumber
 -- | OuterNumber
 newtype OuterNumber = OuterNumber
@@ -1009,7 +930,6 @@
   } deriving (P.Eq, P.Show, P.Typeable, A.ToJSON, A.FromJSON, WH.ToHttpApiData, WH.FromHttpApiData)
 
 
-
 -- ** OuterString
 -- | OuterString
 newtype OuterString = OuterString
@@ -1017,7 +937,6 @@
   } deriving (P.Eq, P.Show, P.Typeable, A.ToJSON, A.FromJSON, WH.ToHttpApiData, WH.FromHttpApiData)
 
 
-
 -- ** Pet
 -- | Pet
 data Pet = Pet
@@ -1026,7 +945,7 @@
   , petName :: !(Text) -- ^ /Required/ "name"
   , petPhotoUrls :: !([Text]) -- ^ /Required/ "photoUrls"
   , petTags :: !(Maybe [Tag]) -- ^ "tags"
-  , petStatus :: !(Maybe Text) -- ^ "status" - pet status in the store
+  , petStatus :: !(Maybe E'Status2) -- ^ "status" - pet status in the store
   } deriving (P.Show, P.Eq, P.Typeable)
 
 -- | FromJSON Pet
@@ -1068,7 +987,6 @@
   , petStatus = Nothing
   }
 
-
 -- ** ReadOnlyFirst
 -- | ReadOnlyFirst
 data ReadOnlyFirst = ReadOnlyFirst
@@ -1101,7 +1019,6 @@
   , readOnlyFirstBaz = Nothing
   }
 
-
 -- ** SpecialModelName
 -- | SpecialModelName
 data SpecialModelName = SpecialModelName
@@ -1130,7 +1047,6 @@
   { specialModelNameSpecialPropertyName = Nothing
   }
 
-
 -- ** Tag
 -- | Tag
 data Tag = Tag
@@ -1163,7 +1079,6 @@
   , tagName = Nothing
   }
 
-
 -- ** User
 -- | User
 data User = User
@@ -1220,7 +1135,6 @@
   , userUserStatus = Nothing
   }
 
-
 -- ** Cat
 -- | Cat
 data Cat = Cat
@@ -1258,7 +1172,6 @@
   , catDeclawed = Nothing
   }
 
-
 -- ** Dog
 -- | Dog
 data Dog = Dog
@@ -1297,4 +1210,388 @@
   }
 
 
+-- * Enums
 
+
+-- ** E'ArrayEnum
+
+-- | Enum of 'Text'
+data E'ArrayEnum
+  = E'ArrayEnum'Fish -- ^ @"fish"@
+  | E'ArrayEnum'Crab -- ^ @"crab"@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'ArrayEnum where toJSON = A.toJSON . fromE'ArrayEnum
+instance A.FromJSON E'ArrayEnum where parseJSON o = P.either P.fail (pure . P.id) . toE'ArrayEnum =<< A.parseJSON o
+instance WH.ToHttpApiData E'ArrayEnum where toQueryParam = WH.toQueryParam . fromE'ArrayEnum
+instance WH.FromHttpApiData E'ArrayEnum where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'ArrayEnum
+instance MimeRender MimeMultipartFormData E'ArrayEnum where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'ArrayEnum' enum
+fromE'ArrayEnum :: E'ArrayEnum -> Text
+fromE'ArrayEnum = \case
+  E'ArrayEnum'Fish -> "fish"
+  E'ArrayEnum'Crab -> "crab"
+
+-- | parse 'E'ArrayEnum' enum
+toE'ArrayEnum :: Text -> P.Either String E'ArrayEnum
+toE'ArrayEnum = \case
+  "fish" -> P.Right E'ArrayEnum'Fish
+  "crab" -> P.Right E'ArrayEnum'Crab
+  s -> P.Left $ "toE'ArrayEnum: enum parse failure: " P.++ P.show s
+
+
+-- ** E'EnumFormString
+
+-- | Enum of 'Text'
+data E'EnumFormString
+  = E'EnumFormString'_abc -- ^ @"_abc"@
+  | E'EnumFormString'_efg -- ^ @"-efg"@
+  | E'EnumFormString'_xyz -- ^ @"(xyz)"@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'EnumFormString where toJSON = A.toJSON . fromE'EnumFormString
+instance A.FromJSON E'EnumFormString where parseJSON o = P.either P.fail (pure . P.id) . toE'EnumFormString =<< A.parseJSON o
+instance WH.ToHttpApiData E'EnumFormString where toQueryParam = WH.toQueryParam . fromE'EnumFormString
+instance WH.FromHttpApiData E'EnumFormString where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'EnumFormString
+instance MimeRender MimeMultipartFormData E'EnumFormString where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'EnumFormString' enum
+fromE'EnumFormString :: E'EnumFormString -> Text
+fromE'EnumFormString = \case
+  E'EnumFormString'_abc -> "_abc"
+  E'EnumFormString'_efg -> "-efg"
+  E'EnumFormString'_xyz -> "(xyz)"
+
+-- | parse 'E'EnumFormString' enum
+toE'EnumFormString :: Text -> P.Either String E'EnumFormString
+toE'EnumFormString = \case
+  "_abc" -> P.Right E'EnumFormString'_abc
+  "-efg" -> P.Right E'EnumFormString'_efg
+  "(xyz)" -> P.Right E'EnumFormString'_xyz
+  s -> P.Left $ "toE'EnumFormString: enum parse failure: " P.++ P.show s
+
+
+-- ** E'EnumInteger
+
+-- | Enum of 'Int'
+data E'EnumInteger
+  = E'EnumInteger'Num1 -- ^ @1@
+  | E'EnumInteger'NumMinus_1 -- ^ @-1@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'EnumInteger where toJSON = A.toJSON . fromE'EnumInteger
+instance A.FromJSON E'EnumInteger where parseJSON o = P.either P.fail (pure . P.id) . toE'EnumInteger =<< A.parseJSON o
+instance WH.ToHttpApiData E'EnumInteger where toQueryParam = WH.toQueryParam . fromE'EnumInteger
+instance WH.FromHttpApiData E'EnumInteger where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'EnumInteger
+instance MimeRender MimeMultipartFormData E'EnumInteger where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'EnumInteger' enum
+fromE'EnumInteger :: E'EnumInteger -> Int
+fromE'EnumInteger = \case
+  E'EnumInteger'Num1 -> 1
+  E'EnumInteger'NumMinus_1 -> -1
+
+-- | parse 'E'EnumInteger' enum
+toE'EnumInteger :: Int -> P.Either String E'EnumInteger
+toE'EnumInteger = \case
+  1 -> P.Right E'EnumInteger'Num1
+  -1 -> P.Right E'EnumInteger'NumMinus_1
+  s -> P.Left $ "toE'EnumInteger: enum parse failure: " P.++ P.show s
+
+
+-- ** E'EnumNumber
+
+-- | Enum of 'Double'
+data E'EnumNumber
+  = E'EnumNumber'Num1_Dot_1 -- ^ @1.1@
+  | E'EnumNumber'NumMinus_1_Dot_2 -- ^ @-1.2@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'EnumNumber where toJSON = A.toJSON . fromE'EnumNumber
+instance A.FromJSON E'EnumNumber where parseJSON o = P.either P.fail (pure . P.id) . toE'EnumNumber =<< A.parseJSON o
+instance WH.ToHttpApiData E'EnumNumber where toQueryParam = WH.toQueryParam . fromE'EnumNumber
+instance WH.FromHttpApiData E'EnumNumber where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'EnumNumber
+instance MimeRender MimeMultipartFormData E'EnumNumber where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'EnumNumber' enum
+fromE'EnumNumber :: E'EnumNumber -> Double
+fromE'EnumNumber = \case
+  E'EnumNumber'Num1_Dot_1 -> 1.1
+  E'EnumNumber'NumMinus_1_Dot_2 -> -1.2
+
+-- | parse 'E'EnumNumber' enum
+toE'EnumNumber :: Double -> P.Either String E'EnumNumber
+toE'EnumNumber = \case
+  1.1 -> P.Right E'EnumNumber'Num1_Dot_1
+  -1.2 -> P.Right E'EnumNumber'NumMinus_1_Dot_2
+  s -> P.Left $ "toE'EnumNumber: enum parse failure: " P.++ P.show s
+
+
+-- ** E'EnumQueryInteger
+
+-- | Enum of 'Int'
+data E'EnumQueryInteger
+  = E'EnumQueryInteger'Num1 -- ^ @1@
+  | E'EnumQueryInteger'NumMinus_2 -- ^ @-2@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'EnumQueryInteger where toJSON = A.toJSON . fromE'EnumQueryInteger
+instance A.FromJSON E'EnumQueryInteger where parseJSON o = P.either P.fail (pure . P.id) . toE'EnumQueryInteger =<< A.parseJSON o
+instance WH.ToHttpApiData E'EnumQueryInteger where toQueryParam = WH.toQueryParam . fromE'EnumQueryInteger
+instance WH.FromHttpApiData E'EnumQueryInteger where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'EnumQueryInteger
+instance MimeRender MimeMultipartFormData E'EnumQueryInteger where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'EnumQueryInteger' enum
+fromE'EnumQueryInteger :: E'EnumQueryInteger -> Int
+fromE'EnumQueryInteger = \case
+  E'EnumQueryInteger'Num1 -> 1
+  E'EnumQueryInteger'NumMinus_2 -> -2
+
+-- | parse 'E'EnumQueryInteger' enum
+toE'EnumQueryInteger :: Int -> P.Either String E'EnumQueryInteger
+toE'EnumQueryInteger = \case
+  1 -> P.Right E'EnumQueryInteger'Num1
+  -2 -> P.Right E'EnumQueryInteger'NumMinus_2
+  s -> P.Left $ "toE'EnumQueryInteger: enum parse failure: " P.++ P.show s
+
+
+-- ** E'EnumString
+
+-- | Enum of 'Text'
+data E'EnumString
+  = E'EnumString'UPPER -- ^ @"UPPER"@
+  | E'EnumString'Lower -- ^ @"lower"@
+  | E'EnumString'Empty -- ^ @""@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'EnumString where toJSON = A.toJSON . fromE'EnumString
+instance A.FromJSON E'EnumString where parseJSON o = P.either P.fail (pure . P.id) . toE'EnumString =<< A.parseJSON o
+instance WH.ToHttpApiData E'EnumString where toQueryParam = WH.toQueryParam . fromE'EnumString
+instance WH.FromHttpApiData E'EnumString where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'EnumString
+instance MimeRender MimeMultipartFormData E'EnumString where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'EnumString' enum
+fromE'EnumString :: E'EnumString -> Text
+fromE'EnumString = \case
+  E'EnumString'UPPER -> "UPPER"
+  E'EnumString'Lower -> "lower"
+  E'EnumString'Empty -> ""
+
+-- | parse 'E'EnumString' enum
+toE'EnumString :: Text -> P.Either String E'EnumString
+toE'EnumString = \case
+  "UPPER" -> P.Right E'EnumString'UPPER
+  "lower" -> P.Right E'EnumString'Lower
+  "" -> P.Right E'EnumString'Empty
+  s -> P.Left $ "toE'EnumString: enum parse failure: " P.++ P.show s
+
+
+-- ** E'Inner
+
+-- | Enum of 'Text'
+data E'Inner
+  = E'Inner'UPPER -- ^ @"UPPER"@
+  | E'Inner'Lower -- ^ @"lower"@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'Inner where toJSON = A.toJSON . fromE'Inner
+instance A.FromJSON E'Inner where parseJSON o = P.either P.fail (pure . P.id) . toE'Inner =<< A.parseJSON o
+instance WH.ToHttpApiData E'Inner where toQueryParam = WH.toQueryParam . fromE'Inner
+instance WH.FromHttpApiData E'Inner where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'Inner
+instance MimeRender MimeMultipartFormData E'Inner where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'Inner' enum
+fromE'Inner :: E'Inner -> Text
+fromE'Inner = \case
+  E'Inner'UPPER -> "UPPER"
+  E'Inner'Lower -> "lower"
+
+-- | parse 'E'Inner' enum
+toE'Inner :: Text -> P.Either String E'Inner
+toE'Inner = \case
+  "UPPER" -> P.Right E'Inner'UPPER
+  "lower" -> P.Right E'Inner'Lower
+  s -> P.Left $ "toE'Inner: enum parse failure: " P.++ P.show s
+
+
+-- ** E'Inner2
+
+-- | Enum of 'Text'
+data E'Inner2
+  = E'Inner2'GreaterThan -- ^ @">"@
+  | E'Inner2'Dollar -- ^ @"$"@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'Inner2 where toJSON = A.toJSON . fromE'Inner2
+instance A.FromJSON E'Inner2 where parseJSON o = P.either P.fail (pure . P.id) . toE'Inner2 =<< A.parseJSON o
+instance WH.ToHttpApiData E'Inner2 where toQueryParam = WH.toQueryParam . fromE'Inner2
+instance WH.FromHttpApiData E'Inner2 where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'Inner2
+instance MimeRender MimeMultipartFormData E'Inner2 where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'Inner2' enum
+fromE'Inner2 :: E'Inner2 -> Text
+fromE'Inner2 = \case
+  E'Inner2'GreaterThan -> ">"
+  E'Inner2'Dollar -> "$"
+
+-- | parse 'E'Inner2' enum
+toE'Inner2 :: Text -> P.Either String E'Inner2
+toE'Inner2 = \case
+  ">" -> P.Right E'Inner2'GreaterThan
+  "$" -> P.Right E'Inner2'Dollar
+  s -> P.Left $ "toE'Inner2: enum parse failure: " P.++ P.show s
+
+
+-- ** E'JustSymbol
+
+-- | Enum of 'Text'
+data E'JustSymbol
+  = E'JustSymbol'Greater_Than_Or_Equal_To -- ^ @">="@
+  | E'JustSymbol'Dollar -- ^ @"$"@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'JustSymbol where toJSON = A.toJSON . fromE'JustSymbol
+instance A.FromJSON E'JustSymbol where parseJSON o = P.either P.fail (pure . P.id) . toE'JustSymbol =<< A.parseJSON o
+instance WH.ToHttpApiData E'JustSymbol where toQueryParam = WH.toQueryParam . fromE'JustSymbol
+instance WH.FromHttpApiData E'JustSymbol where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'JustSymbol
+instance MimeRender MimeMultipartFormData E'JustSymbol where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'JustSymbol' enum
+fromE'JustSymbol :: E'JustSymbol -> Text
+fromE'JustSymbol = \case
+  E'JustSymbol'Greater_Than_Or_Equal_To -> ">="
+  E'JustSymbol'Dollar -> "$"
+
+-- | parse 'E'JustSymbol' enum
+toE'JustSymbol :: Text -> P.Either String E'JustSymbol
+toE'JustSymbol = \case
+  ">=" -> P.Right E'JustSymbol'Greater_Than_Or_Equal_To
+  "$" -> P.Right E'JustSymbol'Dollar
+  s -> P.Left $ "toE'JustSymbol: enum parse failure: " P.++ P.show s
+
+
+-- ** E'Status
+
+-- | Enum of 'Text' . 
+-- Order Status
+data E'Status
+  = E'Status'Placed -- ^ @"placed"@
+  | E'Status'Approved -- ^ @"approved"@
+  | E'Status'Delivered -- ^ @"delivered"@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'Status where toJSON = A.toJSON . fromE'Status
+instance A.FromJSON E'Status where parseJSON o = P.either P.fail (pure . P.id) . toE'Status =<< A.parseJSON o
+instance WH.ToHttpApiData E'Status where toQueryParam = WH.toQueryParam . fromE'Status
+instance WH.FromHttpApiData E'Status where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'Status
+instance MimeRender MimeMultipartFormData E'Status where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'Status' enum
+fromE'Status :: E'Status -> Text
+fromE'Status = \case
+  E'Status'Placed -> "placed"
+  E'Status'Approved -> "approved"
+  E'Status'Delivered -> "delivered"
+
+-- | parse 'E'Status' enum
+toE'Status :: Text -> P.Either String E'Status
+toE'Status = \case
+  "placed" -> P.Right E'Status'Placed
+  "approved" -> P.Right E'Status'Approved
+  "delivered" -> P.Right E'Status'Delivered
+  s -> P.Left $ "toE'Status: enum parse failure: " P.++ P.show s
+
+
+-- ** E'Status2
+
+-- | Enum of 'Text' . 
+-- pet status in the store
+data E'Status2
+  = E'Status2'Available -- ^ @"available"@
+  | E'Status2'Pending -- ^ @"pending"@
+  | E'Status2'Sold -- ^ @"sold"@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON E'Status2 where toJSON = A.toJSON . fromE'Status2
+instance A.FromJSON E'Status2 where parseJSON o = P.either P.fail (pure . P.id) . toE'Status2 =<< A.parseJSON o
+instance WH.ToHttpApiData E'Status2 where toQueryParam = WH.toQueryParam . fromE'Status2
+instance WH.FromHttpApiData E'Status2 where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toE'Status2
+instance MimeRender MimeMultipartFormData E'Status2 where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'E'Status2' enum
+fromE'Status2 :: E'Status2 -> Text
+fromE'Status2 = \case
+  E'Status2'Available -> "available"
+  E'Status2'Pending -> "pending"
+  E'Status2'Sold -> "sold"
+
+-- | parse 'E'Status2' enum
+toE'Status2 :: Text -> P.Either String E'Status2
+toE'Status2 = \case
+  "available" -> P.Right E'Status2'Available
+  "pending" -> P.Right E'Status2'Pending
+  "sold" -> P.Right E'Status2'Sold
+  s -> P.Left $ "toE'Status2: enum parse failure: " P.++ P.show s
+
+
+-- ** EnumClass
+
+-- | Enum of 'Text'
+data EnumClass
+  = EnumClass'_abc -- ^ @"_abc"@
+  | EnumClass'_efg -- ^ @"-efg"@
+  | EnumClass'_xyz -- ^ @"(xyz)"@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON EnumClass where toJSON = A.toJSON . fromEnumClass
+instance A.FromJSON EnumClass where parseJSON o = P.either P.fail (pure . P.id) . toEnumClass =<< A.parseJSON o
+instance WH.ToHttpApiData EnumClass where toQueryParam = WH.toQueryParam . fromEnumClass
+instance WH.FromHttpApiData EnumClass where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toEnumClass
+instance MimeRender MimeMultipartFormData EnumClass where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'EnumClass' enum
+fromEnumClass :: EnumClass -> Text
+fromEnumClass = \case
+  EnumClass'_abc -> "_abc"
+  EnumClass'_efg -> "-efg"
+  EnumClass'_xyz -> "(xyz)"
+
+-- | parse 'EnumClass' enum
+toEnumClass :: Text -> P.Either String EnumClass
+toEnumClass = \case
+  "_abc" -> P.Right EnumClass'_abc
+  "-efg" -> P.Right EnumClass'_efg
+  "(xyz)" -> P.Right EnumClass'_xyz
+  s -> P.Left $ "toEnumClass: enum parse failure: " P.++ P.show s
+
+
+-- ** OuterEnum
+
+-- | Enum of 'Text'
+data OuterEnum
+  = OuterEnum'Placed -- ^ @"placed"@
+  | OuterEnum'Approved -- ^ @"approved"@
+  | OuterEnum'Delivered -- ^ @"delivered"@
+  deriving (P.Show, P.Eq, P.Typeable, P.Ord, P.Bounded, P.Enum)
+
+instance A.ToJSON OuterEnum where toJSON = A.toJSON . fromOuterEnum
+instance A.FromJSON OuterEnum where parseJSON o = P.either P.fail (pure . P.id) . toOuterEnum =<< A.parseJSON o
+instance WH.ToHttpApiData OuterEnum where toQueryParam = WH.toQueryParam . fromOuterEnum
+instance WH.FromHttpApiData OuterEnum where parseQueryParam o = WH.parseQueryParam o >>= P.left T.pack . toOuterEnum
+instance MimeRender MimeMultipartFormData OuterEnum where mimeRender _ = mimeRenderDefaultMultipartFormData
+
+-- | unwrap 'OuterEnum' enum
+fromOuterEnum :: OuterEnum -> Text
+fromOuterEnum = \case
+  OuterEnum'Placed -> "placed"
+  OuterEnum'Approved -> "approved"
+  OuterEnum'Delivered -> "delivered"
+
+-- | parse 'OuterEnum' enum
+toOuterEnum :: Text -> P.Either String OuterEnum
+toOuterEnum = \case
+  "placed" -> P.Right OuterEnum'Placed
+  "approved" -> P.Right OuterEnum'Approved
+  "delivered" -> P.Right OuterEnum'Delivered
+  s -> P.Left $ "toOuterEnum: enum parse failure: " P.++ P.show s
diff --git a/lib/SwaggerPetstore/ModelLens.hs b/lib/SwaggerPetstore/ModelLens.hs
--- a/lib/SwaggerPetstore/ModelLens.hs
+++ b/lib/SwaggerPetstore/ModelLens.hs
@@ -194,12 +194,12 @@
 -- * EnumArrays
 
 -- | 'enumArraysJustSymbol' Lens
-enumArraysJustSymbolL :: Lens_' EnumArrays (Maybe Text)
+enumArraysJustSymbolL :: Lens_' EnumArrays (Maybe E'JustSymbol)
 enumArraysJustSymbolL f EnumArrays{..} = (\enumArraysJustSymbol -> EnumArrays { enumArraysJustSymbol, ..} ) <$> f enumArraysJustSymbol
 {-# INLINE enumArraysJustSymbolL #-}
 
 -- | 'enumArraysArrayEnum' Lens
-enumArraysArrayEnumL :: Lens_' EnumArrays (Maybe [Text])
+enumArraysArrayEnumL :: Lens_' EnumArrays (Maybe [E'ArrayEnum])
 enumArraysArrayEnumL f EnumArrays{..} = (\enumArraysArrayEnum -> EnumArrays { enumArraysArrayEnum, ..} ) <$> f enumArraysArrayEnum
 {-# INLINE enumArraysArrayEnumL #-}
 
@@ -212,17 +212,17 @@
 -- * EnumTest
 
 -- | 'enumTestEnumString' Lens
-enumTestEnumStringL :: Lens_' EnumTest (Maybe Text)
+enumTestEnumStringL :: Lens_' EnumTest (Maybe E'EnumString)
 enumTestEnumStringL f EnumTest{..} = (\enumTestEnumString -> EnumTest { enumTestEnumString, ..} ) <$> f enumTestEnumString
 {-# INLINE enumTestEnumStringL #-}
 
 -- | 'enumTestEnumInteger' Lens
-enumTestEnumIntegerL :: Lens_' EnumTest (Maybe Int)
+enumTestEnumIntegerL :: Lens_' EnumTest (Maybe E'EnumInteger)
 enumTestEnumIntegerL f EnumTest{..} = (\enumTestEnumInteger -> EnumTest { enumTestEnumInteger, ..} ) <$> f enumTestEnumInteger
 {-# INLINE enumTestEnumIntegerL #-}
 
 -- | 'enumTestEnumNumber' Lens
-enumTestEnumNumberL :: Lens_' EnumTest (Maybe Double)
+enumTestEnumNumberL :: Lens_' EnumTest (Maybe E'EnumNumber)
 enumTestEnumNumberL f EnumTest{..} = (\enumTestEnumNumber -> EnumTest { enumTestEnumNumber, ..} ) <$> f enumTestEnumNumber
 {-# INLINE enumTestEnumNumberL #-}
 
@@ -324,7 +324,7 @@
 {-# INLINE mapTestMapMapOfStringL #-}
 
 -- | 'mapTestMapOfEnumString' Lens
-mapTestMapOfEnumStringL :: Lens_' MapTest (Maybe (Map.Map String Text))
+mapTestMapOfEnumStringL :: Lens_' MapTest (Maybe (Map.Map String E'Inner))
 mapTestMapOfEnumStringL f MapTest{..} = (\mapTestMapOfEnumString -> MapTest { mapTestMapOfEnumString, ..} ) <$> f mapTestMapOfEnumString
 {-# INLINE mapTestMapOfEnumStringL #-}
 
@@ -437,7 +437,7 @@
 {-# INLINE orderShipDateL #-}
 
 -- | 'orderStatus' Lens
-orderStatusL :: Lens_' Order (Maybe Text)
+orderStatusL :: Lens_' Order (Maybe E'Status)
 orderStatusL f Order{..} = (\orderStatus -> Order { orderStatus, ..} ) <$> f orderStatus
 {-# INLINE orderStatusL #-}
 
@@ -511,7 +511,7 @@
 {-# INLINE petTagsL #-}
 
 -- | 'petStatus' Lens
-petStatusL :: Lens_' Pet (Maybe Text)
+petStatusL :: Lens_' Pet (Maybe E'Status2)
 petStatusL f Pet{..} = (\petStatus -> Pet { petStatus, ..} ) <$> f petStatus
 {-# INLINE petStatusL #-}
 
diff --git a/swagger-petstore.cabal b/swagger-petstore.cabal
--- a/swagger-petstore.cabal
+++ b/swagger-petstore.cabal
@@ -1,5 +1,5 @@
 name:           swagger-petstore
-version:        0.0.1.4
+version:        0.0.1.5
 synopsis:       Auto-generated swagger-petstore API Client
 description:    .
                 Client library for calling the swagger-petstore API based on http-client.
@@ -22,7 +22,6 @@
 license:        MIT
 build-type:     Simple
 cabal-version:  >= 1.10
-
 extra-source-files:
     README.md
     swagger.yaml
@@ -40,7 +39,7 @@
     , bytestring >=0.10.0 && <0.11
     , base64-bytestring >1.0 && <2.0
     , containers >=0.5.0.0 && <0.6
-    , http-types >=0.8 && <0.10
+    , http-types >=0.8 && <0.11
     , http-client >=0.5 && <0.6
     , http-client-tls
     , http-api-data >= 0.3.4 && <0.4
diff --git a/swagger.yaml b/swagger.yaml
--- a/swagger.yaml
+++ b/swagger.yaml
@@ -918,6 +918,27 @@
       responses:
         200:
           description: "successful operation"
+  /fake/inline-additionalProperties:
+    post:
+      tags:
+      - "fake"
+      summary: "test inline additionalProperties"
+      description: ""
+      operationId: "testInlineAdditionalProperties"
+      consumes:
+      - "application/json"
+      parameters:
+      - in: "body"
+        name: "param"
+        description: "request body"
+        required: true
+        schema:
+          type: "object"
+          additionalProperties:
+            type: "string"
+      responses:
+        200:
+          description: "successful operation"
   /another-fake/dummy:
     patch:
       tags:
@@ -966,15 +987,19 @@
       id:
         type: "integer"
         format: "int64"
+        x-dataType: "Integer"
       petId:
         type: "integer"
         format: "int64"
+        x-dataType: "Integer"
       quantity:
         type: "integer"
         format: "int32"
+        x-dataType: "Int"
       shipDate:
         type: "string"
         format: "date-time"
+        x-dataType: "DateTime"
       status:
         type: "string"
         description: "Order Status"
@@ -982,9 +1007,11 @@
         - "placed"
         - "approved"
         - "delivered"
+        x-dataType: "E'Status"
       complete:
         type: "boolean"
         default: false
+        x-dataType: "Bool"
     example:
       petId: 6
       quantity: 1
@@ -1003,8 +1030,10 @@
       id:
         type: "integer"
         format: "int64"
+        x-dataType: "Integer"
       name:
         type: "string"
+        x-dataType: "Text"
     example:
       name: "name"
       id: 6
@@ -1017,22 +1046,30 @@
         type: "integer"
         format: "int64"
         x-is-unique: true
+        x-dataType: "Integer"
       username:
         type: "string"
+        x-dataType: "Text"
       firstName:
         type: "string"
+        x-dataType: "Text"
       lastName:
         type: "string"
+        x-dataType: "Text"
       email:
         type: "string"
+        x-dataType: "Text"
       password:
         type: "string"
+        x-dataType: "Text"
       phone:
         type: "string"
+        x-dataType: "Text"
       userStatus:
         type: "integer"
         format: "int32"
         description: "User Status"
+        x-dataType: "Int"
     example:
       firstName: "firstName"
       lastName: "lastName"
@@ -1053,8 +1090,10 @@
       id:
         type: "integer"
         format: "int64"
+        x-dataType: "Integer"
       name:
         type: "string"
+        x-dataType: "Text"
     example:
       name: "name"
       id: 1
@@ -1070,11 +1109,14 @@
         type: "integer"
         format: "int64"
         x-is-unique: true
+        x-dataType: "Integer"
       category:
         $ref: "#/definitions/Category"
+        x-dataType: "Category"
       name:
         type: "string"
         example: "doggie"
+        x-dataType: "Text"
       photoUrls:
         type: "array"
         xml:
@@ -1082,6 +1124,7 @@
           wrapped: true
         items:
           type: "string"
+        x-dataType: "[Text]"
       tags:
         type: "array"
         xml:
@@ -1089,6 +1132,7 @@
           wrapped: true
         items:
           $ref: "#/definitions/Tag"
+        x-dataType: "[Tag]"
       status:
         type: "string"
         description: "pet status in the store"
@@ -1096,6 +1140,7 @@
         - "available"
         - "pending"
         - "sold"
+        x-dataType: "E'Status2"
     example:
       photoUrls:
       - "photoUrls"
@@ -1122,10 +1167,13 @@
       code:
         type: "integer"
         format: "int32"
+        x-dataType: "Int"
       type:
         type: "string"
+        x-dataType: "Text"
       message:
         type: "string"
+        x-dataType: "Text"
     example:
       code: 0
       type: "type"
@@ -1135,6 +1183,7 @@
       $special[property.name]:
         type: "integer"
         format: "int64"
+        x-dataType: "Integer"
     xml:
       name: "$special[model.name]"
   Return:
@@ -1142,6 +1191,7 @@
       return:
         type: "integer"
         format: "int32"
+        x-dataType: "Int"
     description: "Model for testing reserved words"
     xml:
       name: "Return"
@@ -1152,15 +1202,19 @@
       name:
         type: "integer"
         format: "int32"
+        x-dataType: "Int"
       snake_case:
         type: "integer"
         format: "int32"
         readOnly: true
+        x-dataType: "Int"
       property:
         type: "string"
+        x-dataType: "Text"
       123Number:
         type: "integer"
         readOnly: true
+        x-dataType: "Int"
     description: "Model for testing model name same as property name"
     xml:
       name: "Name"
@@ -1169,8 +1223,10 @@
       name:
         type: "integer"
         format: "int32"
+        x-dataType: "Int"
       class:
         type: "string"
+        x-dataType: "Text"
     description: "Model for testing model name starting with number"
     xml:
       name: "Name"
@@ -1178,6 +1234,7 @@
     properties:
       _class:
         type: "string"
+        x-dataType: "Text"
     description: "Model for testing model with \"_class\" property"
   Dog:
     allOf:
@@ -1186,6 +1243,7 @@
       properties:
         breed:
           type: "string"
+          x-dataType: "Text"
   Cat:
     allOf:
     - $ref: "#/definitions/Animal"
@@ -1193,6 +1251,7 @@
       properties:
         declawed:
           type: "boolean"
+          x-dataType: "Bool"
   Animal:
     type: "object"
     required:
@@ -1201,9 +1260,11 @@
     properties:
       className:
         type: "string"
+        x-dataType: "Text"
       color:
         type: "string"
         default: "red"
+        x-dataType: "Text"
   AnimalFarm:
     type: "array"
     items:
@@ -1220,52 +1281,65 @@
         type: "integer"
         minimum: 10
         maximum: 100
+        x-dataType: "Int"
       int32:
         type: "integer"
         format: "int32"
         minimum: 20
         maximum: 200
+        x-dataType: "Int"
       int64:
         type: "integer"
         format: "int64"
+        x-dataType: "Integer"
       number:
         type: "number"
         minimum: 32.1
         maximum: 543.2
+        x-dataType: "Double"
       float:
         type: "number"
         format: "float"
         minimum: 54.3
         maximum: 987.6
+        x-dataType: "Float"
       double:
         type: "number"
         format: "double"
         minimum: 67.8
         maximum: 123.4
+        x-dataType: "Double"
       string:
         type: "string"
         pattern: "/[a-z]/i"
+        x-dataType: "Text"
       byte:
         type: "string"
         format: "byte"
         pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"
+        x-dataType: "ByteArray"
       binary:
         type: "string"
         format: "binary"
+        x-dataType: "Binary"
       date:
         type: "string"
         format: "date"
+        x-dataType: "Date"
       dateTime:
         type: "string"
         format: "date-time"
+        x-dataType: "DateTime"
       uuid:
         type: "string"
         format: "uuid"
+        x-dataType: "Text"
       password:
         type: "string"
         format: "password"
         minLength: 10
         maxLength: 64
+        x-dataType: "Text"
   EnumClass:
     type: "string"
     enum:
@@ -1282,20 +1356,24 @@
         - "UPPER"
         - "lower"
         - ""
+        x-dataType: "E'EnumString"
       enum_integer:
         type: "integer"
         format: "int32"
         enum:
         - 1
         - -1
+        x-dataType: "E'EnumInteger"
       enum_number:
         type: "number"
         format: "double"
         enum:
         - 1.1
         - -1.2
+        x-dataType: "E'EnumNumber"
       outerEnum:
         $ref: "#/definitions/OuterEnum"
+        x-dataType: "OuterEnum"
   AdditionalPropertiesClass:
     type: "object"
     properties:
@@ -1303,35 +1381,42 @@
         type: "object"
         additionalProperties:
           type: "string"
+        x-dataType: "(Map.Map String Text)"
       map_of_map_property:
         type: "object"
         additionalProperties:
           type: "object"
           additionalProperties:
             type: "string"
+        x-dataType: "(Map.Map String (Map.Map String Text))"
   MixedPropertiesAndAdditionalPropertiesClass:
     type: "object"
     properties:
       uuid:
         type: "string"
         format: "uuid"
+        x-dataType: "Text"
       dateTime:
         type: "string"
         format: "date-time"
+        x-dataType: "DateTime"
       map:
         type: "object"
         additionalProperties:
           $ref: "#/definitions/Animal"
+        x-dataType: "(Map.Map String Animal)"
   List:
     type: "object"
     properties:
       123-list:
         type: "string"
+        x-dataType: "Text"
   Client:
     type: "object"
     properties:
       client:
         type: "string"
+        x-dataType: "Text"
     example:
       client: "client"
     x-mimeTypes:
@@ -1342,33 +1427,43 @@
       bar:
         type: "string"
         readOnly: true
+        x-dataType: "Text"
       baz:
         type: "string"
+        x-dataType: "Text"
   hasOnlyReadOnly:
     type: "object"
     properties:
       bar:
         type: "string"
         readOnly: true
+        x-dataType: "Text"
       foo:
         type: "string"
         readOnly: true
+        x-dataType: "Text"
   Capitalization:
     type: "object"
     properties:
       smallCamel:
         type: "string"
+        x-dataType: "Text"
       CapitalCamel:
         type: "string"
+        x-dataType: "Text"
       small_Snake:
         type: "string"
+        x-dataType: "Text"
       Capital_Snake:
         type: "string"
+        x-dataType: "Text"
       SCA_ETH_Flow_Points:
         type: "string"
+        x-dataType: "Text"
       ATT_NAME:
         type: "string"
         description: "Name of the pet\n"
+        x-dataType: "Text"
   MapTest:
     type: "object"
     properties:
@@ -1378,6 +1473,7 @@
           type: "object"
           additionalProperties:
             type: "string"
+        x-dataType: "(Map.Map String (Map.Map String Text))"
       map_of_enum_string:
         type: "object"
         additionalProperties:
@@ -1385,6 +1481,7 @@
           enum:
           - "UPPER"
           - "lower"
+        x-dataType: "(Map.Map String E'Inner)"
   ArrayTest:
     type: "object"
     properties:
@@ -1392,6 +1489,7 @@
         type: "array"
         items:
           type: "string"
+        x-dataType: "[Text]"
       array_array_of_integer:
         type: "array"
         items:
@@ -1399,17 +1497,20 @@
           items:
             type: "integer"
             format: "int64"
+        x-dataType: "[[Integer]]"
       array_array_of_model:
         type: "array"
         items:
           type: "array"
           items:
             $ref: "#/definitions/ReadOnlyFirst"
+        x-dataType: "[[ReadOnlyFirst]]"
   NumberOnly:
     type: "object"
     properties:
       JustNumber:
         type: "number"
+        x-dataType: "Double"
   ArrayOfNumberOnly:
     type: "object"
     properties:
@@ -1417,6 +1518,7 @@
         type: "array"
         items:
           type: "number"
+        x-dataType: "[Double]"
   ArrayOfArrayOfNumberOnly:
     type: "object"
     properties:
@@ -1426,6 +1528,7 @@
           type: "array"
           items:
             type: "number"
+        x-dataType: "[[Double]]"
   EnumArrays:
     type: "object"
     properties:
@@ -1434,6 +1537,7 @@
         enum:
         - ">="
         - "$"
+        x-dataType: "E'JustSymbol"
       array_enum:
         type: "array"
         items:
@@ -1441,6 +1545,7 @@
           enum:
           - "fish"
           - "crab"
+        x-dataType: "[E'ArrayEnum]"
   OuterEnum:
     type: "string"
     enum:
@@ -1452,20 +1557,26 @@
     properties:
       my_number:
         $ref: "#/definitions/OuterNumber"
+        x-dataType: "OuterNumber"
       my_string:
         $ref: "#/definitions/OuterString"
+        x-dataType: "OuterString"
       my_boolean:
         $ref: "#/definitions/OuterBoolean"
+        x-dataType: "OuterBoolean"
     example:
       my_string: {}
       my_number: {}
       my_boolean: {}
   OuterNumber:
     type: "number"
+    x-dataType: "Double"
   OuterString:
     type: "string"
+    x-dataType: "Text"
   OuterBoolean:
     type: "boolean"
+    x-dataType: "Bool"
 externalDocs:
   description: "Find out more about Swagger"
   url: "http://swagger.io"
diff --git a/tests/Instances.hs b/tests/Instances.hs
--- a/tests/Instances.hs
+++ b/tests/Instances.hs
@@ -95,20 +95,17 @@
       <$> arbitrary -- additionalPropertiesClassMapProperty :: Maybe (Map.Map String Text)
       <*> arbitrary -- additionalPropertiesClassMapOfMapProperty :: Maybe (Map.Map String (Map.Map String Text))
     
-
 instance Arbitrary Animal where
   arbitrary =
     Animal
       <$> arbitrary -- animalClassName :: Text
       <*> arbitrary -- animalColor :: Maybe Text
     
-
 instance Arbitrary AnimalFarm where
   arbitrary =
     
     pure AnimalFarm
      
-
 instance Arbitrary ApiResponse where
   arbitrary =
     ApiResponse
@@ -116,19 +113,16 @@
       <*> arbitrary -- apiResponseType :: Maybe Text
       <*> arbitrary -- apiResponseMessage :: Maybe Text
     
-
 instance Arbitrary ArrayOfArrayOfNumberOnly where
   arbitrary =
     ArrayOfArrayOfNumberOnly
       <$> arbitrary -- arrayOfArrayOfNumberOnlyArrayArrayNumber :: Maybe [[Double]]
     
-
 instance Arbitrary ArrayOfNumberOnly where
   arbitrary =
     ArrayOfNumberOnly
       <$> arbitrary -- arrayOfNumberOnlyArrayNumber :: Maybe [Double]
     
-
 instance Arbitrary ArrayTest where
   arbitrary =
     ArrayTest
@@ -136,7 +130,6 @@
       <*> arbitrary -- arrayTestArrayArrayOfInteger :: Maybe [[Integer]]
       <*> arbitrary -- arrayTestArrayArrayOfModel :: Maybe [[ReadOnlyFirst]]
     
-
 instance Arbitrary Capitalization where
   arbitrary =
     Capitalization
@@ -147,39 +140,28 @@
       <*> arbitrary -- capitalizationScaEthFlowPoints :: Maybe Text
       <*> arbitrary -- capitalizationAttName :: Maybe Text
     
-
 instance Arbitrary Category where
   arbitrary =
     Category
       <$> arbitrary -- categoryId :: Maybe Integer
       <*> arbitrary -- categoryName :: Maybe Text
     
-
 instance Arbitrary ClassModel where
   arbitrary =
     ClassModel
       <$> arbitrary -- classModelClass :: Maybe Text
     
-
 instance Arbitrary Client where
   arbitrary =
     Client
       <$> arbitrary -- clientClient :: Maybe Text
     
-
 instance Arbitrary EnumArrays where
   arbitrary =
     EnumArrays
       <$> arbitrary -- enumArraysJustSymbol :: Maybe Text
       <*> arbitrary -- enumArraysArrayEnum :: Maybe [Text]
     
-
-instance Arbitrary EnumClass where
-  arbitrary =
-    
-    pure EnumClass
-     
-
 instance Arbitrary EnumTest where
   arbitrary =
     EnumTest
@@ -188,7 +170,6 @@
       <*> arbitrary -- enumTestEnumNumber :: Maybe Double
       <*> arbitrary -- enumTestOuterEnum :: Maybe OuterEnum
     
-
 instance Arbitrary FormatTest where
   arbitrary =
     FormatTest
@@ -206,21 +187,18 @@
       <*> arbitrary -- formatTestUuid :: Maybe Text
       <*> arbitrary -- formatTestPassword :: Text
     
-
 instance Arbitrary HasOnlyReadOnly where
   arbitrary =
     HasOnlyReadOnly
       <$> arbitrary -- hasOnlyReadOnlyBar :: Maybe Text
       <*> arbitrary -- hasOnlyReadOnlyFoo :: Maybe Text
     
-
 instance Arbitrary MapTest where
   arbitrary =
     MapTest
       <$> arbitrary -- mapTestMapMapOfString :: Maybe (Map.Map String (Map.Map String Text))
       <*> arbitrary -- mapTestMapOfEnumString :: Maybe (Map.Map String Text)
     
-
 instance Arbitrary MixedPropertiesAndAdditionalPropertiesClass where
   arbitrary =
     MixedPropertiesAndAdditionalPropertiesClass
@@ -228,26 +206,22 @@
       <*> arbitrary -- mixedPropertiesAndAdditionalPropertiesClassDateTime :: Maybe DateTime
       <*> arbitrary -- mixedPropertiesAndAdditionalPropertiesClassMap :: Maybe (Map.Map String Animal)
     
-
 instance Arbitrary Model200Response where
   arbitrary =
     Model200Response
       <$> arbitrary -- model200ResponseName :: Maybe Int
       <*> arbitrary -- model200ResponseClass :: Maybe Text
     
-
 instance Arbitrary ModelList where
   arbitrary =
     ModelList
       <$> arbitrary -- modelList123List :: Maybe Text
     
-
 instance Arbitrary ModelReturn where
   arbitrary =
     ModelReturn
       <$> arbitrary -- modelReturnReturn :: Maybe Int
     
-
 instance Arbitrary Name where
   arbitrary =
     Name
@@ -256,13 +230,11 @@
       <*> arbitrary -- nameProperty :: Maybe Text
       <*> arbitrary -- name123Number :: Maybe Int
     
-
 instance Arbitrary NumberOnly where
   arbitrary =
     NumberOnly
       <$> arbitrary -- numberOnlyJustNumber :: Maybe Double
     
-
 instance Arbitrary Order where
   arbitrary =
     Order
@@ -273,11 +245,9 @@
       <*> arbitrary -- orderStatus :: Maybe Text
       <*> arbitrary -- orderComplete :: Maybe Bool
     
-
 instance Arbitrary OuterBoolean where
   arbitrary =
     OuterBoolean <$> arbitrary
-
 instance Arbitrary OuterComposite where
   arbitrary =
     OuterComposite
@@ -285,21 +255,12 @@
       <*> arbitrary -- outerCompositeMyString :: Maybe OuterString
       <*> arbitrary -- outerCompositeMyBoolean :: Maybe OuterBoolean
     
-
-instance Arbitrary OuterEnum where
-  arbitrary =
-    
-    pure OuterEnum
-     
-
 instance Arbitrary OuterNumber where
   arbitrary =
     OuterNumber <$> arbitrary
-
 instance Arbitrary OuterString where
   arbitrary =
     OuterString <$> arbitrary
-
 instance Arbitrary Pet where
   arbitrary =
     Pet
@@ -310,27 +271,23 @@
       <*> arbitrary -- petTags :: Maybe [Tag]
       <*> arbitrary -- petStatus :: Maybe Text
     
-
 instance Arbitrary ReadOnlyFirst where
   arbitrary =
     ReadOnlyFirst
       <$> arbitrary -- readOnlyFirstBar :: Maybe Text
       <*> arbitrary -- readOnlyFirstBaz :: Maybe Text
     
-
 instance Arbitrary SpecialModelName where
   arbitrary =
     SpecialModelName
       <$> arbitrary -- specialModelNameSpecialPropertyName :: Maybe Integer
     
-
 instance Arbitrary Tag where
   arbitrary =
     Tag
       <$> arbitrary -- tagId :: Maybe Integer
       <*> arbitrary -- tagName :: Maybe Text
     
-
 instance Arbitrary User where
   arbitrary =
     User
@@ -343,7 +300,6 @@
       <*> arbitrary -- userPhone :: Maybe Text
       <*> arbitrary -- userUserStatus :: Maybe Int
     
-
 instance Arbitrary Cat where
   arbitrary =
     Cat
@@ -351,7 +307,6 @@
       <*> arbitrary -- catColor :: Maybe Text
       <*> arbitrary -- catDeclawed :: Maybe Bool
     
-
 instance Arbitrary Dog where
   arbitrary =
     Dog
@@ -361,3 +316,42 @@
     
 
 
+
+instance Arbitrary E'ArrayEnum where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'EnumFormString where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'EnumInteger where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'EnumNumber where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'EnumQueryInteger where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'EnumString where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'Inner where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'Inner2 where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'JustSymbol where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'Status where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary E'Status2 where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary EnumClass where
+  arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary OuterEnum where
+  arbitrary = arbitraryBoundedEnum
