diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+2.1.4
+-----
+
+* Add `liftDeclare` (see [#100](https://github.com/GetShopTV/swagger2/pull/100));
+* Add `MonadDeclare` instances for all monad transformers (see [#100](https://github.com/GetShopTV/swagger2/pull/100)).
+
 2.1.3
 -----
 
diff --git a/examples/hackage.hs b/examples/hackage.hs
--- a/examples/hackage.hs
+++ b/examples/hackage.hs
@@ -20,7 +20,21 @@
 data UserSummary = UserSummary
   { summaryUsername :: Username
   , summaryUserid   :: Int
-  } deriving (Generic, ToSchema)
+  } deriving (Generic)
+
+instance ToSchema UserSummary where
+  declareNamedSchema _ = do
+    usernameSchema <- declareSchemaRef (Proxy :: Proxy Username)
+    useridSchema   <- declareSchemaRef (Proxy :: Proxy Int)
+    return $ NamedSchema (Just "UserSummary") $ mempty
+      & type_ .~ SwaggerObject
+      & properties .~
+          [ ("summaryUsername", usernameSchema )
+          , ("summaryUserid"  , useridSchema   )
+          ]
+      & required .~ [ "summaryUsername"
+                    , "summaryUserid"   ]
+
 
 type Group = Text
 
diff --git a/src/Data/Swagger/Declare.hs b/src/Data/Swagger/Declare.hs
--- a/src/Data/Swagger/Declare.hs
+++ b/src/Data/Swagger/Declare.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE FunctionalDependencies #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE UndecidableInstances #-}
 -- |
 -- Module:      Data.Swagger.Declare
 -- Maintainer:  Nickolay Kudasov <nickolay@getshoptv.com>
@@ -14,7 +15,19 @@
 import Prelude.Compat
 
 import Control.Monad
+import Control.Monad.Cont (ContT)
+import Control.Monad.List (ListT)
+import Control.Monad.Reader (ReaderT)
 import Control.Monad.Trans
+import Control.Monad.Trans.Except (ExceptT)
+import Control.Monad.Trans.Identity (IdentityT)
+import Control.Monad.Trans.Maybe (MaybeT)
+import Control.Monad.Trans.State.Lazy as Lazy
+import Control.Monad.Trans.State.Strict as Strict
+import Control.Monad.Trans.RWS.Lazy as Lazy
+import Control.Monad.Trans.RWS.Strict as Strict
+import Control.Monad.Trans.Writer.Lazy as Lazy
+import Control.Monad.Trans.Writer.Strict as Strict
 import Data.Functor.Identity
 import Data.Monoid
 
@@ -77,6 +90,13 @@
   declare d = DeclareT (\_ -> return (d, ()))
   look = DeclareT (\d -> return (mempty, d))
 
+-- | Lift a computation from the simple Declare monad.
+liftDeclare :: MonadDeclare d m => Declare d a -> m a
+liftDeclare da = do
+  (d', a) <- looks (runDeclare da)
+  declare d'
+  pure a
+
 -- | Retrieve a function of all the output so far.
 looks :: MonadDeclare d m => (d -> a) -> m a
 looks f = f <$> look
@@ -125,3 +145,56 @@
 undeclare :: Monoid d => Declare d a -> a
 undeclare = runIdentity . undeclareT
 
+-- ---------------------------------------------------------------------------
+-- Instances for other mtl transformers
+--
+-- All of these instances need UndecidableInstances,
+-- because they do not satisfy the coverage condition.
+
+instance MonadDeclare d m => MonadDeclare d (ContT r m) where
+  declare = lift . declare
+  look = lift look
+
+instance MonadDeclare d m => MonadDeclare d (ExceptT e m) where
+  declare = lift . declare
+  look = lift look
+
+instance MonadDeclare d m => MonadDeclare d (IdentityT m) where
+  declare = lift . declare
+  look = lift look
+
+instance MonadDeclare d m => MonadDeclare d (ListT m) where
+  declare = lift . declare
+  look = lift look
+
+instance MonadDeclare d m => MonadDeclare d (MaybeT m) where
+  declare = lift . declare
+  look = lift look
+
+instance MonadDeclare d m => MonadDeclare d (ReaderT r m) where
+  declare = lift . declare
+  look = lift look
+
+instance (Monoid w, MonadDeclare d m) => MonadDeclare d (Lazy.RWST r w s m) where
+  declare = lift . declare
+  look = lift look
+
+instance (Monoid w, MonadDeclare d m) => MonadDeclare d (Strict.RWST r w s m) where
+  declare = lift . declare
+  look = lift look
+
+instance MonadDeclare d m => MonadDeclare d (Lazy.StateT s m) where
+  declare = lift . declare
+  look = lift look
+
+instance MonadDeclare d m => MonadDeclare d (Strict.StateT s m) where
+  declare = lift . declare
+  look = lift look
+
+instance (Monoid w, MonadDeclare d m) => MonadDeclare d (Lazy.WriterT w m) where
+  declare = lift . declare
+  look = lift look
+
+instance (Monoid w, MonadDeclare d m) => MonadDeclare d (Strict.WriterT w m) where
+  declare = lift . declare
+  look = lift look
diff --git a/src/Data/Swagger/Internal/ParamSchema.hs b/src/Data/Swagger/Internal/ParamSchema.hs
--- a/src/Data/Swagger/Internal/ParamSchema.hs
+++ b/src/Data/Swagger/Internal/ParamSchema.hs
@@ -83,9 +83,9 @@
 -- data Direction = Up | Down
 --
 -- instance ToParamSchema Direction where
---   toParamSchema = mempty
+--   toParamSchema _ = mempty
 --      & type_ .~ SwaggerString
---      & enum_ .~ [ \"Up\", \"Down\" ]
+--      & enum_ ?~ [ \"Up\", \"Down\" ]
 -- @
 --
 -- Instead of manually writing your @'ToParamSchema'@ instance you can
diff --git a/src/Data/Swagger/Internal/Schema.hs b/src/Data/Swagger/Internal/Schema.hs
--- a/src/Data/Swagger/Internal/Schema.hs
+++ b/src/Data/Swagger/Internal/Schema.hs
@@ -104,9 +104,9 @@
 -- data Coord = Coord { x :: Double, y :: Double }
 --
 -- instance ToSchema Coord where
---   declareNamedSchema = do
+--   declareNamedSchema _ = do
 --     doubleSchema <- declareSchemaRef (Proxy :: Proxy Double)
---     return $ NamedSchema (Just \"Coord\")) $ mempty
+--     return $ NamedSchema (Just \"Coord\") $ mempty
 --       & type_ .~ SwaggerObject
 --       & properties .~
 --           [ (\"x\", doubleSchema)
@@ -685,6 +685,8 @@
       then schema
         & type_ .~ SwaggerArray
         & items %~ appendItem ref
+        & maxItems %~ Just . maybe 1 (+1)   -- increment maxItems
+        & minItems %~ Just . maybe 1 (+1)   -- increment minItems
       else schema
         & type_ .~ SwaggerObject
         & properties . at fname ?~ ref
diff --git a/swagger2.cabal b/swagger2.cabal
--- a/swagger2.cabal
+++ b/swagger2.cabal
@@ -1,5 +1,5 @@
 name:                swagger2
-version:             2.1.3
+version:             2.1.4
 synopsis:            Swagger 2.0 data model
 description:         Please see README.md
 homepage:            https://github.com/GetShopTV/swagger2
@@ -56,6 +56,7 @@
                      , template-haskell
                      , time
                      , transformers
+                     , transformers-compat >= 0.3
                      , unordered-containers
                      , vector
                      , uuid-types >=1.0.2 && <1.1
diff --git a/test/Data/Swagger/SchemaSpec.hs b/test/Data/Swagger/SchemaSpec.hs
--- a/test/Data/Swagger/SchemaSpec.hs
+++ b/test/Data/Swagger/SchemaSpec.hs
@@ -146,7 +146,9 @@
     [
       { "type": "integer" },
       { "type": "string"  }
-    ]
+    ],
+  "minItems": 2,
+  "maxItems": 2
 }
 |]
 
