diff --git a/lib/OryKratos/API.hs b/lib/OryKratos/API.hs
--- a/lib/OryKratos/API.hs
+++ b/lib/OryKratos/API.hs
@@ -10,6 +10,7 @@
 {-# LANGUAGE TypeFamilies               #-}
 {-# LANGUAGE TypeOperators              #-}
 {-# LANGUAGE ViewPatterns               #-}
+{-# LANGUAGE DerivingStrategies #-}
 {-# OPTIONS_GHC
 -fno-warn-unused-binds -fno-warn-unused-imports -freduction-depth=328 #-}
 
@@ -72,7 +73,9 @@
 -- | List of elements parsed from a query.
 newtype QueryList (p :: CollectionFormat) a = QueryList
   { fromQueryList :: [a]
-  } deriving (Functor, Applicative, Monad, Foldable, Traversable)
+  } 
+  deriving stock (Traversable)
+  deriving newtype (Functor, Applicative, Monad, Foldable)
 
 -- | Formats in which a list can be encoded into a HTTP path.
 data CollectionFormat
@@ -164,12 +167,12 @@
 -- | Server or client configuration, specifying the host and port to query or serve on.
 data Config = Config
   { configUrl :: String  -- ^ scheme://hostname:port/path, e.g. "http://localhost:8080/"
-  } deriving (Eq, Ord, Show, Read)
+  } deriving stock (Eq, Ord, Show, Read)
 
 
 -- | Custom exception type for our errors.
 newtype OryKratosClientError = OryKratosClientError ClientError
-  deriving (Show, Exception)
+  deriving newtype (Show, Exception)
 -- | Configuration, specifying the full url of the service.
 
 
@@ -219,7 +222,7 @@
 
 newtype OryKratosClient a = OryKratosClient
   { runClient :: ClientEnv -> ExceptT ClientError IO a
-  } deriving Functor
+  } deriving stock (Functor)
 
 instance Applicative OryKratosClient where
   pure x = OryKratosClient (\_ -> pure x)
diff --git a/lib/OryKratos/Types.hs b/lib/OryKratos/Types.hs
--- a/lib/OryKratos/Types.hs
+++ b/lib/OryKratos/Types.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DerivingStrategies #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE DuplicateRecordFields #-}
@@ -64,6 +65,10 @@
 import Data.UUID (UUID)
 import GHC.Generics (Generic)
 
+typeFieldRename :: String -> String
+typeFieldRename "_type" = "type"
+typeFieldRename x = x
+
 -- |
 data CompleteSelfServiceLoginFlowWithPasswordMethod = CompleteSelfServiceLoginFlowWithPasswordMethod
   { -- | Sending the anti-csrf token is only required for browser login flows.
@@ -73,7 +78,7 @@
     -- | The user's password.
     password :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON CompleteSelfServiceLoginFlowWithPasswordMethod
 
@@ -87,7 +92,7 @@
     -- | Email to Recover  Needs to be set when initiating the flow. If the email is a registered recovery email, a recovery link will be sent. If the email is not known, a email with details on what happened will be sent instead.  format: email in: body
     email :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON CompleteSelfServiceRecoveryFlowWithLinkMethod
 
@@ -101,7 +106,7 @@
     -- | Password is the updated password  type: string
     password :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON CompleteSelfServiceSettingsFlowWithPasswordMethod
 
@@ -115,7 +120,7 @@
     -- | Email to Verify  Needs to be set when initiating the flow. If the email is a registered verification email, a verification link will be sent. If the email is not known, a email with details on what happened will be sent instead.  format: email in: body
     email :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON CompleteSelfServiceVerificationFlowWithLinkMethod
 
@@ -129,7 +134,7 @@
     -- | Traits represent an identity's traits. The identity is able to create, modify, and delete traits in a self-service manner. The input will always be validated against the JSON Schema defined in `schema_url`.
     traits :: Value
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON CreateIdentity
 
@@ -143,7 +148,7 @@
     -- |
     identity_id :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON CreateRecoveryLink
 
@@ -157,7 +162,7 @@
     -- |
     id :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON ErrorContainer
 
@@ -181,20 +186,22 @@
     -- | Value is the equivalent of `<input value=\"{{.Value}}\">`
     value :: Maybe Value
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON FormField where
   parseJSON =
     genericParseJSON
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 instance ToJSON FormField where
   toEncoding =
     genericToEncoding
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 -- | Error responses are sent when an error (e.g. unauthorized, bad request, ...) occurred.
@@ -202,7 +209,7 @@
   { -- |
     error :: Maybe GenericErrorPayload
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON GenericError
 
@@ -226,7 +233,7 @@
     -- |
     status :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON GenericErrorPayload
 
@@ -238,7 +245,7 @@
   { -- | Errors contains a list of errors that caused the not ready status.
     errors :: Maybe (Map.Map String Text)
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON HealthNotReadyStatus
 
@@ -250,7 +257,7 @@
   { -- | Status always contains \"ok\".
     status :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON HealthStatus
 
@@ -272,7 +279,7 @@
     -- | VerifiableAddresses contains all the addresses that can be verified by the user.
     verifiable_addresses :: Maybe [VerifiableAddress]
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON Identity
 
@@ -294,26 +301,28 @@
     -- |
     messages :: Maybe [Message],
     -- | List of login methods  This is the list of available login methods with their required form fields, such as `identifier` and `password` for the password login method. This will also contain error messages such as \"password can not be empty\".
-    methods :: (Map.Map String LoginFlowMethod),
+    methods :: Map.Map String LoginFlowMethod,
     -- | RequestURL is the initial URL that was requested from ORY Kratos. It can be used to forward information contained in the URL's path or query for example.
     request_url :: Text,
     -- | The flow type can either be `api` or `browser`.
     _type :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON LoginFlow where
   parseJSON =
     genericParseJSON
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 instance ToJSON LoginFlow where
   toEncoding =
     genericToEncoding
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 -- |
@@ -323,7 +332,7 @@
     -- | and so on.
     method :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON LoginFlowMethod
 
@@ -343,7 +352,7 @@
     -- | Providers is set for the \"oidc\" flow method.
     providers :: Maybe [FormField]
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON LoginFlowMethodConfig
 
@@ -357,7 +366,7 @@
     -- | The Session Token  A session token is equivalent to a session cookie, but it can be sent in the HTTP Authorization Header:  Authorization: bearer ${session-token}  The session token is only issued for API flows, not for Browser flows!
     session_token :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON LoginViaApiResponse
 
@@ -375,20 +384,22 @@
     -- | The flow type can either be `api` or `browser`.
     _type :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON Message where
   parseJSON =
     genericParseJSON
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 instance ToJSON Message where
   toEncoding =
     genericToEncoding
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 -- |
@@ -400,7 +411,7 @@
     -- |
     via :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RecoveryAddress
 
@@ -420,7 +431,7 @@
     -- |
     messages :: Maybe [Message],
     -- | Methods contains context for all account recovery methods. If a registration request has been processed, but for example the password is incorrect, this will contain error messages.
-    methods :: (Map.Map String RecoveryFlowMethod),
+    methods :: Map.Map String RecoveryFlowMethod,
     -- | RequestURL is the initial URL that was requested from ORY Kratos. It can be used to forward information contained in the URL's path or query for example.
     request_url :: Text,
     -- |
@@ -428,20 +439,22 @@
     -- | The flow type can either be `api` or `browser`.
     _type :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RecoveryFlow where
   parseJSON =
     genericParseJSON
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 instance ToJSON RecoveryFlow where
   toEncoding =
     genericToEncoding
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 -- |
@@ -451,7 +464,7 @@
     -- | Method contains the request credentials type.
     method :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RecoveryFlowMethod
 
@@ -469,7 +482,7 @@
     -- | Method is the form method (e.g. POST)
     method :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RecoveryFlowMethodConfig
 
@@ -483,7 +496,7 @@
     -- | Recovery Link  This link can be used to recover the account.
     recovery_link :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RecoveryLink
 
@@ -503,26 +516,28 @@
     -- |
     messages :: Maybe [Message],
     -- | Methods contains context for all enabled registration methods. If a registration flow has been processed, but for example the password is incorrect, this will contain error messages.
-    methods :: (Map.Map String RegistrationFlowMethod),
+    methods :: Map.Map String RegistrationFlowMethod,
     -- | RequestURL is the initial URL that was requested from ORY Kratos. It can be used to forward information contained in the URL's path or query for example.
     request_url :: Text,
     -- | The flow type can either be `api` or `browser`.
     _type :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RegistrationFlow where
   parseJSON =
     genericParseJSON
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 instance ToJSON RegistrationFlow where
   toEncoding =
     genericToEncoding
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 -- |
@@ -532,7 +547,7 @@
     -- | and so on.
     method :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RegistrationFlowMethod
 
@@ -552,7 +567,7 @@
     -- | Providers is set for the \"oidc\" registration method.
     providers :: Maybe [FormField]
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RegistrationFlowMethodConfig
 
@@ -568,7 +583,7 @@
     -- | The Session Token  This field is only set when the session hook is configured as a post-registration hook.  A session token is equivalent to a session cookie, but it can be sent in the HTTP Authorization Header:  Authorization: bearer ${session-token}  The session token is only issued for API flows, not for Browser flows!
     session_token :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RegistrationViaApiResponse
 
@@ -580,7 +595,7 @@
   { -- | The Session Token  Invalidate this session token.
     session_token :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON RevokeSession
 
@@ -602,7 +617,7 @@
     -- |
     issued_at :: UTCTime
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON Session
 
@@ -624,7 +639,7 @@
     -- |
     messages :: Maybe [Message],
     -- | Methods contains context for all enabled registration methods. If a settings flow has been processed, but for example the first name is empty, this will contain error messages.
-    methods :: (Map.Map String SettingsFlowMethod),
+    methods :: Map.Map String SettingsFlowMethod,
     -- | RequestURL is the initial URL that was requested from ORY Kratos. It can be used to forward information contained in the URL's path or query for example.
     request_url :: Text,
     -- |
@@ -632,20 +647,22 @@
     -- | The flow type can either be `api` or `browser`.
     _type :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON SettingsFlow where
   parseJSON =
     genericParseJSON
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 instance ToJSON SettingsFlow where
   toEncoding =
     genericToEncoding
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 -- |
@@ -655,7 +672,7 @@
     -- | Method is the name of this flow method.
     method :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON SettingsFlowMethod
 
@@ -673,7 +690,7 @@
     -- | Method is the form method (e.g. POST)
     method :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON SettingsFlowMethodConfig
 
@@ -687,7 +704,7 @@
     -- |
     identity :: Identity
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON SettingsViaApiResponse
 
@@ -701,7 +718,7 @@
     -- | Traits represent an identity's traits. The identity is able to create, modify, and delete traits in a self-service manner. The input will always be validated against the JSON Schema defined in `schema_id`.
     traits :: Value
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON UpdateIdentity
 
@@ -723,7 +740,7 @@
     -- |
     via :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON VerifiableAddress
 
@@ -743,7 +760,7 @@
     -- |
     messages :: Maybe [Message],
     -- | Methods contains context for all account verification methods. If a registration request has been processed, but for example the password is incorrect, this will contain error messages.
-    methods :: (Map.Map String VerificationFlowMethod),
+    methods :: Map.Map String VerificationFlowMethod,
     -- | RequestURL is the initial URL that was requested from ORY Kratos. It can be used to forward information contained in the URL's path or query for example.
     request_url :: Maybe Text,
     -- |
@@ -751,20 +768,22 @@
     -- | The flow type can either be `api` or `browser`.
     _type :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON VerificationFlow where
   parseJSON =
     genericParseJSON
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 instance ToJSON VerificationFlow where
   toEncoding =
     genericToEncoding
       defaultOptions
-        { constructorTagModifier = \f -> if f == "_type" then "type" else f
+        { constructorTagModifier = typeFieldRename,
+          fieldLabelModifier = typeFieldRename
         }
 
 -- |
@@ -774,7 +793,7 @@
     -- | Method contains the request credentials type.
     method :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON VerificationFlowMethod
 
@@ -792,7 +811,7 @@
     -- | Method is the form method (e.g. POST)
     method :: Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON VerificationFlowMethodConfig
 
@@ -804,7 +823,7 @@
   { -- | Version is the service's version.
     version :: Maybe Text
   }
-  deriving (Show, Eq, Generic, Data)
+  deriving stock (Show, Eq, Generic, Data)
 
 instance FromJSON Version
 
diff --git a/ory-kratos.cabal b/ory-kratos.cabal
--- a/ory-kratos.cabal
+++ b/ory-kratos.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name:          ory-kratos
-version:       0.0.5.6
+version:       0.0.5.7
 synopsis:      API bindings for Ory Kratos
 description:   Auto-generated API bindings for ory-kratos 0.5.5-alpha1
 homepage:      https://github.com/njaremko/ory-kratos-haskell-sdk
@@ -11,13 +11,7 @@
 build-type:    Simple
 license:       Apache-2.0
 
-library
-  hs-source-dirs:   lib
-  exposed-modules:
-    OryKratos.API
-    OryKratos.Types
-
-  ghc-options:      -Wall
+common common-options
   build-depends:
     , aeson                >=1.4.7 && < 1.6
     , base                 ^>=4.14.0.0
@@ -40,5 +34,36 @@
     , uuid                 >=1.3.13 && <1.4
     , wai                  >=3.2.2 && <3.3
     , warp                 >=3.3.13 && <3.4
+  
+  ghc-options:         -Wall
+                       -Wcompat
+                       -Widentities
+                       -Wincomplete-uni-patterns
+                       -Wincomplete-record-updates
+  if impl(ghc >= 8.0)
+    ghc-options:       -Wredundant-constraints
+  if impl(ghc >= 8.2)
+    ghc-options:       -fhide-source-paths
+  if impl(ghc >= 8.4)
+    ghc-options:       -Wmissing-export-lists
+                       -Wpartial-fields
+  if impl(ghc >= 8.8)
+    ghc-options:       -Wmissing-deriving-strategies
 
   default-language: Haskell2010
+
+library
+  import:           common-options
+  hs-source-dirs:   lib
+  exposed-modules:
+    OryKratos.API
+    OryKratos.Types
+
+test-suite ory-kratos-test
+  import:              common-options
+  type:                exitcode-stdio-1.0
+  hs-source-dirs:      test
+  main-is:             Spec.hs
+  ghc-options:         -threaded
+                       -rtsopts
+                       -with-rtsopts=-N
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,4 @@
+module Main (main) where
+
+main :: IO ()
+main = putStrLn ("Test suite is not implemented" :: String)
