diff --git a/Prolude/Core.hs b/Prolude/Core.hs
--- a/Prolude/Core.hs
+++ b/Prolude/Core.hs
@@ -7,6 +7,7 @@
   , module Data.Monoid
     -- * Base re-exports
   , module Data.Bool
+  , module Data.Bifunctor
   , module Data.Either
   , module Data.Eq
   , module Data.Foldable
@@ -48,6 +49,7 @@
 import Control.Monad (Monad((>>), (>>=)))
 import Control.Monad.Fail (MonadFail(fail))
 import Data.Bool (Bool(False, True), not, otherwise, (&&), (||))
+import Data.Bifunctor (Bifunctor(bimap, first, second))
 import Data.Char (Char, chr, ord)
 import Data.Either (Either(Left, Right), either)
 import Data.Eq (Eq((/=), (==)))
diff --git a/Prolude/Swagger.hs b/Prolude/Swagger.hs
--- a/Prolude/Swagger.hs
+++ b/Prolude/Swagger.hs
@@ -1,30 +1,53 @@
 {-# LANGUAGE ConstraintKinds #-}
 
-module Prolude.Swagger 
-    ( -- * SwaggerType re-export
-      Swagger.SwaggerType(..)
-      -- * Alias types
-      -- $alias
-    , SwaggerToSchema
-    , SwaggerToParamSchema
-      -- * Functions
-    , defaultDeclareNamedSchema
-    )
-where
+module Prolude.Swagger
+  ( -- * SwaggerType re-export
+    Swagger.SwaggerType(..)
+  -- * Alias types
+  , SwaggerToSchema
+  , SwaggerToParamSchema
+  -- * Functions
+  , defaultDeclareNamedSchema
+  , nameSchema
+  ) where
 
 import qualified Data.Swagger as Swagger
-import qualified Data.Swagger.Declare as Swagger
-import qualified Data.Swagger.Internal.Schema as Swagger
-import qualified Data.Swagger.Internal.TypeShape as Swagger
-
-{- $alias
-We created type aliases for Swagger.ToSchema and Swagger.ToParamSchema.
--}
+import qualified Data.Text as Text
+import qualified Data.Typeable as Typeable
 
 type SwaggerToParamSchema = Swagger.ToParamSchema
+
 type SwaggerToSchema = Swagger.ToSchema
 
--- | Function to help with Swagger.ToSchema instances
+-- | This function makes it easy to define a 'Swagger.ToSchema' instance. Just
+-- pass in a function that modifies the default empty schema and you're good to
+-- go. For example:
+--
+-- > instance ToSchema SomeType where
+-- >   declareNamedSchema = defaultDeclareNamedSchema
+-- >     $ set type_ (Just SwaggerObject)
+-- >     . set title (Just "some type")
 defaultDeclareNamedSchema
-  :: Applicative f => (Swagger.Schema -> Swagger.Schema) -> proxy a -> f Swagger.NamedSchema
-defaultDeclareNamedSchema f = const . pure . Swagger.NamedSchema Nothing $ f mempty
+  :: (Typeable.Typeable a, Applicative f)
+  => (Swagger.Schema -> Swagger.Schema)
+  -> proxy a
+  -> f Swagger.NamedSchema
+defaultDeclareNamedSchema modify proxy =
+  let
+    schema = modify mempty
+    namedSchema = nameSchema proxy schema
+  in pure namedSchema
+
+-- | Generates a unique name for the given type and adds that name to the
+-- schema. The generated name will be like @ModuleName.TypeName@. For example
+-- it might be @Data.Maybe.Maybe@.
+nameSchema :: Typeable.Typeable a => proxy a -> Swagger.Schema -> Swagger.NamedSchema
+nameSchema proxy schema =
+  let
+    typeRep = Typeable.typeRep proxy
+    tyCon = Typeable.typeRepTyCon typeRep
+    moduleName = Typeable.tyConModule tyCon
+    typeName = Typeable.tyConName tyCon
+    nameString = mconcat [moduleName, ".", typeName]
+    nameText = Text.pack nameString
+  in Swagger.NamedSchema (Just nameText) schema
diff --git a/prolude.cabal b/prolude.cabal
--- a/prolude.cabal
+++ b/prolude.cabal
@@ -1,7 +1,7 @@
 cabal-version: >= 1.10
 
 name: prolude
-version: 0.0.0.17
+version: 0.0.0.18
 synopsis: ITProTV's custom prelude
 description:
     Prolude is ITProTV's custom prelude.
@@ -52,7 +52,7 @@
         , bytestring >= 0.10.10 && < 0.11
         , cassava >= 0.5.2.0 && < 0.6
         , containers >= 0.6.2 && < 0.7
-        , generic-random >= 1.3.0 && < 1.4
+        , generic-random >= 1.3.0 && < 1.5
         , mongoDB >= 2.7.0 && < 2.8
         , mtl >= 2.2.2 && < 2.3
         , QuickCheck >= 2.13.2 && < 2.15
