diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+1.0.2
+---
+
+* Minor changes:
+    * Add GHC 7.8 support (see [#26](https://github.com/haskell-servant/servant-swagger/pull/26)).
+
+* Fixes:
+    * Improve compile-time performance of `BodyTypes` (see [#25](https://github.com/haskell-servant/servant-swagger/issues/25)).
+
 1.0.1
 ---
 
diff --git a/example/example.cabal b/example/example.cabal
--- a/example/example.cabal
+++ b/example/example.cabal
@@ -48,7 +48,7 @@
     TodoSpec
     Paths_example
   build-depends:    base  == 4.*
-                  , aeson
+                  , aeson >=0.9.0.1
                   , bytestring
                   , example
                   , hspec
diff --git a/example/src/Todo.hs b/example/src/Todo.hs
--- a/example/src/Todo.hs
+++ b/example/src/Todo.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE DataKinds                  #-}
+{-# LANGUAGE DeriveDataTypeable         #-}
 {-# LANGUAGE DeriveGeneric              #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE OverloadedStrings          #-}
@@ -10,7 +11,7 @@
 import Data.Proxy
 import Data.Text (Text)
 import Data.Time (UTCTime(..), fromGregorian)
-import Data.Typeable
+import Data.Typeable (Typeable)
 import Data.Swagger
 import GHC.Generics
 import Servant
diff --git a/example/test/TodoSpec.hs b/example/test/TodoSpec.hs
--- a/example/test/TodoSpec.hs
+++ b/example/test/TodoSpec.hs
@@ -1,6 +1,7 @@
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 module TodoSpec where
 
+import Control.Applicative
 import Data.Aeson
 import qualified Data.ByteString.Lazy.Char8 as BL8
 import Servant.Swagger.Test
diff --git a/servant-swagger.cabal b/servant-swagger.cabal
--- a/servant-swagger.cabal
+++ b/servant-swagger.cabal
@@ -1,5 +1,5 @@
 name:                servant-swagger
-version:             1.0.1
+version:             1.0.2
 synopsis:            Generate Swagger specification for your servant API.
 description:         Please see README.md
 homepage:            https://github.com/haskell-servant/servant-swagger
@@ -72,7 +72,7 @@
   main-is:          Spec.hs
   build-depends:    base  == 4.*
                   , aeson
-                  , aeson-qq
+                  , aeson-qq >=0.8.1
                   , hspec
                   , QuickCheck
                   , lens
diff --git a/src/Servant/Swagger.hs b/src/Servant/Swagger.hs
--- a/src/Servant/Swagger.hs
+++ b/src/Servant/Swagger.hs
@@ -46,6 +46,7 @@
 import Servant.Swagger.Test
 
 -- $setup
+-- >>> import Control.Applicative
 -- >>> import Control.Lens
 -- >>> import Data.Aeson
 -- >>> import Data.Swagger
@@ -55,6 +56,7 @@
 -- >>> import Test.Hspec
 -- >>> import Test.QuickCheck
 -- >>> :set -XDataKinds
+-- >>> :set -XDeriveDataTypeable
 -- >>> :set -XDeriveGeneric
 -- >>> :set -XGeneralizedNewtypeDeriving
 -- >>> :set -XOverloadedStrings
diff --git a/src/Servant/Swagger/Internal.hs b/src/Servant/Swagger/Internal.hs
--- a/src/Servant/Swagger/Internal.hs
+++ b/src/Servant/Swagger/Internal.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
@@ -6,6 +7,13 @@
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE ConstraintKinds #-}
+#if __GLASGOW_HASKELL__ >= 710
+#define OVERLAPPABLE_ {-# OVERLAPPABLE #-}
+#else
+{-# LANGUAGE OverlappingInstances #-}
+#define OVERLAPPABLE_
+#endif
 module Servant.Swagger.Internal where
 
 import Control.Lens
@@ -119,7 +127,7 @@
 markdownCode s = "`" <> s <> "`"
 
 addDefaultResponse404 :: ParamName -> Swagger -> Swagger
-addDefaultResponse404 pname = setResponseWith (\old _new -> alter404 old) 404 (pure response404)
+addDefaultResponse404 pname = setResponseWith (\old _new -> alter404 old) 404 (return response404)
   where
     sname = markdownCode pname
     description404 = sname <> " not found"
@@ -127,7 +135,7 @@
     response404 = mempty & description .~ description404
 
 addDefaultResponse400 :: ParamName -> Swagger -> Swagger
-addDefaultResponse400 pname = setResponseWith (\old _new -> alter400 old) 400 (pure response400)
+addDefaultResponse400 pname = setResponseWith (\old _new -> alter400 old) 400 (return response400)
   where
     sname = markdownCode pname
     description400 = "Invalid " <> sname
@@ -138,7 +146,7 @@
 -- DELETE
 -- -----------------------------------------------------------------------
 
-instance {-# OVERLAPPABLE #-} (ToSchema a, AllAccept cs) => HasSwagger (Delete cs a) where
+instance OVERLAPPABLE_ (ToSchema a, AllAccept cs) => HasSwagger (Delete cs a) where
   toSwagger _ = toSwagger (Proxy :: Proxy (Delete cs (Headers '[] a)))
 
 instance (ToSchema a, AllAccept cs, AllToResponseHeader hs) => HasSwagger (Delete cs (Headers hs a)) where
@@ -151,7 +159,7 @@
 -- GET
 -- -----------------------------------------------------------------------
 
-instance {-# OVERLAPPABLE #-} (ToSchema a, AllAccept cs) => HasSwagger (Get cs a) where
+instance OVERLAPPABLE_ (ToSchema a, AllAccept cs) => HasSwagger (Get cs a) where
   toSwagger _ = toSwagger (Proxy :: Proxy (Get cs (Headers '[] a)))
 
 instance (ToSchema a, AllAccept cs, AllToResponseHeader hs) => HasSwagger (Get cs (Headers hs a)) where
@@ -164,7 +172,7 @@
 -- PATCH
 -- -----------------------------------------------------------------------
 
-instance {-# OVERLAPPABLE #-} (ToSchema a, AllAccept cs) => HasSwagger (Patch cs a) where
+instance OVERLAPPABLE_ (ToSchema a, AllAccept cs) => HasSwagger (Patch cs a) where
   toSwagger _ = toSwagger (Proxy :: Proxy (Patch cs (Headers '[] a)))
 
 instance (ToSchema a, AllAccept cs, AllToResponseHeader hs) => HasSwagger (Patch cs (Headers hs a)) where
@@ -177,7 +185,7 @@
 -- PUT
 -- -----------------------------------------------------------------------
 
-instance {-# OVERLAPPABLE #-} (ToSchema a, AllAccept cs) => HasSwagger (Put cs a) where
+instance OVERLAPPABLE_ (ToSchema a, AllAccept cs) => HasSwagger (Put cs a) where
   toSwagger _ = toSwagger (Proxy :: Proxy (Put cs (Headers '[] a)))
 
 instance (ToSchema a, AllAccept cs, AllToResponseHeader hs) => HasSwagger (Put cs (Headers hs a)) where
@@ -190,7 +198,7 @@
 -- POST
 -- -----------------------------------------------------------------------
 
-instance {-# OVERLAPPABLE #-} (ToSchema a, AllAccept cs) => HasSwagger (Post cs a) where
+instance OVERLAPPABLE_ (ToSchema a, AllAccept cs) => HasSwagger (Post cs a) where
   toSwagger _ = toSwagger (Proxy :: Proxy (Post cs (Headers '[] a)))
 
 instance (ToSchema a, AllAccept cs, AllToResponseHeader hs) => HasSwagger (Post cs (Headers hs a)) where
diff --git a/src/Servant/Swagger/Internal/Test.hs b/src/Servant/Swagger/Internal/Test.hs
--- a/src/Servant/Swagger/Internal/Test.hs
+++ b/src/Servant/Swagger/Internal/Test.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE ConstraintKinds #-}
 module Servant.Swagger.Internal.Test where
 
 import Data.Aeson (ToJSON)
@@ -17,6 +18,7 @@
 import Servant.Swagger.Internal.TypeLevel
 
 -- $setup
+-- >>> import Control.Applicative
 -- >>> import GHC.Generics
 -- >>> import Test.QuickCheck
 -- >>> :set -XDeriveGeneric
diff --git a/src/Servant/Swagger/Internal/TypeLevel/API.hs b/src/Servant/Swagger/Internal/TypeLevel/API.hs
--- a/src/Servant/Swagger/Internal/TypeLevel/API.hs
+++ b/src/Servant/Swagger/Internal/TypeLevel/API.hs
@@ -63,7 +63,7 @@
 -- | Merge two lists, ignoring any type in @xs@ which occurs also in @ys@.
 type family Merge xs ys where
   Merge '[] ys = ys
-  Merge (x ': xs) ys = Insert x (Merge xs ys)
+  Merge (x ': xs) ys = If (Elem x ys) (Merge xs ys) (x ': (Merge xs ys))
 
 -- | Extract a list of unique "body" types for a specific content-type from a servant API.
 type family BodyTypes c api :: [*] where
@@ -80,4 +80,5 @@
   BodyTypes c (ReqBody cs a :> api) = AddBodyType c cs a (BodyTypes c api)
   BodyTypes c (e :> api) = BodyTypes c api
   BodyTypes c (a :<|> b) = Merge (BodyTypes c a) (BodyTypes c b)
+  BodyTypes c api = '[]
 
diff --git a/src/Servant/Swagger/Internal/TypeLevel/Every.hs b/src/Servant/Swagger/Internal/TypeLevel/Every.hs
--- a/src/Servant/Swagger/Internal/TypeLevel/Every.hs
+++ b/src/Servant/Swagger/Internal/TypeLevel/Every.hs
@@ -52,9 +52,8 @@
 -- | Like @'tmap'@, but uses @'Every'@ for multiple constraints.
 --
 -- >>> let zero :: forall p a. (Show a, Num a) => p a -> String; zero _ = show (0 :: a)
--- >>> tmapEvery (Proxy :: Proxy [Show, Num]) zero (Proxy :: Proxy [Int, Float])
+-- >>> tmapEvery (Proxy :: Proxy [Show, Num]) zero (Proxy :: Proxy [Int, Float]) :: [String]
 -- ["0","0.0"]
 tmapEvery :: forall a cs p p'' xs. (TMap (Every cs) xs) =>
-  p cs -> (forall x p'. EveryTF cs x => p' x -> a) -> p'' xs -> [a]
+  p cs -> (forall x p'. Every cs x => p' x -> a) -> p'' xs -> [a]
 tmapEvery _ = tmap (Proxy :: Proxy (Every cs))
-
diff --git a/test/Servant/SwaggerSpec.hs b/test/Servant/SwaggerSpec.hs
--- a/test/Servant/SwaggerSpec.hs
+++ b/test/Servant/SwaggerSpec.hs
@@ -1,9 +1,9 @@
 {-# LANGUAGE DataKinds #-}
-{-# LANGUAGE DeriveAnyClass #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE DeriveDataTypeable #-}
 module Servant.SwaggerSpec where
 
 import Control.Lens
@@ -11,6 +11,7 @@
 import qualified Data.Aeson.Types as JSON
 import Data.Aeson.QQ
 import Data.Char (toLower)
+import Data.Int (Int64)
 import Data.Proxy
 import Data.Swagger
 import Data.Text (Text)
@@ -43,10 +44,14 @@
   { created :: UTCTime
   , title   :: String
   , summary :: Maybe String
-  } deriving (Generic, FromJSON, ToSchema)
+  } deriving (Generic)
 
-newtype TodoId = TodoId String deriving (Generic, ToParamSchema)
+instance ToJSON Todo
+instance ToSchema Todo
 
+newtype TodoId = TodoId String deriving (Generic)
+instance ToParamSchema TodoId
+
 type TodoAPI = "todo" :> Capture "id" TodoId :> Get '[JSON] Todo
 
 todoAPI :: Value
@@ -127,7 +132,7 @@
 
 data UserSummary = UserSummary
   { summaryUsername :: Username
-  , summaryUserid   :: Int
+  , summaryUserid   :: Int64  -- Word64 would make sense too
   } deriving (Eq, Show, Generic)
 
 lowerCutPrefix :: String -> String -> String
@@ -146,12 +151,14 @@
 
 data UserDetailed = UserDetailed
   { username :: Username
-  , userid   :: Int
+  , userid   :: Int64
   , groups   :: [Group]
-  } deriving (Eq, Show, Generic, ToSchema)
+  } deriving (Eq, Show, Generic)
+instance ToSchema UserDetailed
 
 newtype Package = Package { packageName :: Text }
-  deriving (Eq, Show, Generic, ToSchema)
+  deriving (Eq, Show, Generic)
+instance ToSchema Package
 
 hackageSwaggerWithTags :: Swagger
 hackageSwaggerWithTags = toSwagger (Proxy :: Proxy HackageAPI)
@@ -193,7 +200,8 @@
             "userid":{
                "maximum":9223372036854775807,
                "minimum":-9223372036854775808,
-               "type":"integer"
+               "type":"integer",
+               "format":"int64"
             }
          }
       },
@@ -221,7 +229,8 @@
             "userid":{
                "maximum":9223372036854775807,
                "minimum":-9223372036854775808,
-               "type":"integer"
+               "type":"integer",
+               "format":"int64"
             }
          },
          "example":{
