diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 1.4.31
+
+* Add `parseCheckJsonBody` and `requireCheckJsonBody`
+
 ## 1.4.30
 
 * Add `defaultMessageWidget`
diff --git a/Yesod/Core.hs b/Yesod/Core.hs
--- a/Yesod/Core.hs
+++ b/Yesod/Core.hs
@@ -18,7 +18,7 @@
     , Approot (..)
     , FileUpload (..)
     , ErrorResponse (..)
-      -- * Utitlities
+      -- * Utilities
     , maybeAuthorized
     , widgetToPageContent
       -- * Defaults
diff --git a/Yesod/Core/Json.hs b/Yesod/Core/Json.hs
--- a/Yesod/Core/Json.hs
+++ b/Yesod/Core/Json.hs
@@ -13,8 +13,10 @@
 
       -- * Convert to a JSON value
     , parseJsonBody
+    , parseCheckJsonBody
     , parseJsonBody_
     , requireJsonBody
+    , requireCheckJsonBody
 
       -- * Produce JSON values
     , J.Value (..)
@@ -33,7 +35,7 @@
     , acceptsJson
     ) where
 
-import Yesod.Core.Handler (HandlerT, getRequest, invalidArgs, redirect, selectRep, provideRep, rawRequestBody, ProvidedRep)
+import Yesod.Core.Handler (HandlerT, getRequest, invalidArgs, redirect, selectRep, provideRep, rawRequestBody, ProvidedRep, lookupHeader)
 import Control.Monad.Trans.Writer (Writer)
 import Data.Monoid (Endo)
 import Yesod.Core.Content (TypedContent)
@@ -121,6 +123,15 @@
         Left e -> J.Error $ show e
         Right value -> J.fromJSON value
 
+-- | Same as 'parseJsonBody', but ensures that the mime type indicates
+-- JSON content.
+parseCheckJsonBody :: (MonadHandler m, J.FromJSON a) => m (J.Result a)
+parseCheckJsonBody = do
+    mct <- lookupHeader "content-type"
+    case fmap (B8.takeWhile (/= ';')) mct of
+        Just "application/json" -> parseJsonBody
+        _ -> return $ J.Error $ "Non-JSON content type: " ++ show mct
+
 -- | Same as 'parseJsonBody', but return an invalid args response on a parse
 -- error.
 parseJsonBody_ :: (MonadHandler m, J.FromJSON a) => m a
@@ -132,6 +143,15 @@
 requireJsonBody :: (MonadHandler m, J.FromJSON a) => m a
 requireJsonBody = do
     ra <- parseJsonBody
+    case ra of
+        J.Error s -> invalidArgs [pack s]
+        J.Success a -> return a
+
+-- | Same as 'requireJsonBody', but ensures that the mime type
+-- indicates JSON content.
+requireCheckJsonBody :: (MonadHandler m, J.FromJSON a) => m a
+requireCheckJsonBody = do
+    ra <- parseCheckJsonBody
     case ra of
         J.Error s -> invalidArgs [pack s]
         J.Success a -> return a
diff --git a/Yesod/Routes/TH/RenderRoute.hs b/Yesod/Routes/TH/RenderRoute.hs
--- a/Yesod/Routes/TH/RenderRoute.hs
+++ b/Yesod/Routes/TH/RenderRoute.hs
@@ -46,7 +46,9 @@
 
     mkRouteCon (ResourceParent name _check pieces children) = do
         (cons, decs) <- mkRouteCons children
-#if MIN_VERSION_template_haskell(2,11,0)
+#if MIN_VERSION_template_haskell(2,12,0)
+        dec <- DataD [] (mkName name) [] Nothing cons <$> fmap (pure . DerivClause Nothing) (mapM conT [''Show, ''Read, ''Eq])
+#elif MIN_VERSION_template_haskell(2,11,0)
         dec <- DataD [] (mkName name) [] Nothing cons <$> mapM conT [''Show, ''Read, ''Eq]
 #else
         let dec = DataD [] (mkName name) [] cons [''Show, ''Read, ''Eq]
@@ -153,7 +155,9 @@
 mkRenderRouteInstance' cxt typ ress = do
     cls <- mkRenderRouteClauses ress
     (cons, decs) <- mkRouteCons ress
-#if MIN_VERSION_template_haskell(2,11,0)
+#if MIN_VERSION_template_haskell(2,12,0)
+    did <- DataInstD [] ''Route [typ] Nothing cons <$> fmap (pure . DerivClause Nothing) (mapM conT clazzes)
+#elif MIN_VERSION_template_haskell(2,11,0)
     did <- DataInstD [] ''Route [typ] Nothing cons <$> mapM conT clazzes
 #else
     let did = DataInstD [] ''Route [typ] cons clazzes
diff --git a/yesod-core.cabal b/yesod-core.cabal
--- a/yesod-core.cabal
+++ b/yesod-core.cabal
@@ -1,5 +1,5 @@
 name:            yesod-core
-version:         1.4.30
+version:         1.4.31
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -47,7 +47,7 @@
                    , case-insensitive      >= 0.2
                    , parsec                >= 2        && < 3.2
                    , directory             >= 1
-                   , vector                >= 0.9      && < 0.12
+                   , vector                >= 0.9      && < 0.13
                    , aeson                 >= 0.5
                    , fast-logger           >= 2.2
                    , wai-logger            >= 0.2
