diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # ChangeLog for yesod-core
 
+## 1.6.27.1
+
+* Set `base >= 4.11` for less CPP and imports [#1876](https://github.com/yesodweb/yesod/pull/1876)
+
 ## 1.6.27.0
 
 * Build with `wai-extra-3.1.17` [#1861](https://github.com/yesodweb/yesod/pull/1861)
diff --git a/bench/widget.hs b/bench/widget.hs
--- a/bench/widget.hs
+++ b/bench/widget.hs
@@ -1,15 +1,14 @@
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleContexts #-}
--- | BigTable benchmark implemented using Hamlet.
---
+{-# LANGUAGE OverloadedStrings #-}
+-- BigTable benchmark implemented using Hamlet.
 {-# LANGUAGE QuasiQuotes #-}
+
 module Main where
 
 import Gauge.Main
 import Text.Hamlet
 import qualified Data.ByteString.Lazy as L
 import qualified Text.Blaze.Html.Renderer.Utf8 as Utf8
-import Data.Monoid (mconcat)
 import Text.Blaze.Html5 (table, tr, td)
 import Text.Blaze.Html (toHtml)
 import Data.Int
@@ -64,6 +63,6 @@
     -}
 
 bigTableBlaze :: Show a => [[a]] -> Int64
-bigTableBlaze t = L.length $ Utf8.renderHtml $ table $ Data.Monoid.mconcat $ map row t
+bigTableBlaze t = L.length $ Utf8.renderHtml $ table $ concatMap row t
   where
-    row r = tr $ mconcat $ map (td . toHtml . show) r
+    row r = tr $ concatMap (td . toHtml . show) r
diff --git a/src/Yesod/Core.hs b/src/Yesod/Core.hs
--- a/src/Yesod/Core.hs
+++ b/src/Yesod/Core.hs
@@ -1,8 +1,9 @@
-{-# LANGUAGE UndecidableInstances #-}
-{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE UndecidableInstances #-}
 {-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}
+
 module Yesod.Core
     ( -- * Type classes
       Yesod (..)
diff --git a/src/Yesod/Core/Class/Breadcrumbs.hs b/src/Yesod/Core/Class/Breadcrumbs.hs
--- a/src/Yesod/Core/Class/Breadcrumbs.hs
+++ b/src/Yesod/Core/Class/Breadcrumbs.hs
@@ -1,5 +1,6 @@
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
+
 module Yesod.Core.Class.Breadcrumbs where
 
 import Yesod.Core.Handler
diff --git a/src/Yesod/Core/Class/Dispatch.hs b/src/Yesod/Core/Class/Dispatch.hs
--- a/src/Yesod/Core/Class/Dispatch.hs
+++ b/src/Yesod/Core/Class/Dispatch.hs
@@ -1,9 +1,10 @@
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE FlexibleContexts  #-}
+
 module Yesod.Core.Class.Dispatch where
 
 import qualified Network.Wai as W
diff --git a/src/Yesod/Core/Class/Handler.hs b/src/Yesod/Core/Class/Handler.hs
--- a/src/Yesod/Core/Class/Handler.hs
+++ b/src/Yesod/Core/Class/Handler.hs
@@ -1,10 +1,11 @@
 {-# LANGUAGE CPP #-}
-{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE ConstraintKinds #-}
-{-# LANGUAGE TupleSections #-}
-{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE UndecidableInstances #-}
+
 module Yesod.Core.Class.Handler
     ( MonadHandler (..)
     , MonadWidget (..)
diff --git a/src/Yesod/Core/Class/Yesod.hs b/src/Yesod/Core/Class/Yesod.hs
--- a/src/Yesod/Core/Class/Yesod.hs
+++ b/src/Yesod/Core/Class/Yesod.hs
@@ -1,8 +1,7 @@
-{-# LANGUAGE FlexibleContexts    #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE QuasiQuotes         #-}
-{-# LANGUAGE TemplateHaskell     #-}
-{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
 
 module Yesod.Core.Class.Yesod where
 
@@ -26,7 +25,7 @@
 import           Data.List                          (foldl', nub)
 import qualified Data.Map                           as Map
 import           Data.Maybe                         (catMaybes)
-import           Data.Monoid
+import           Data.Monoid                        (Last (..))
 import           Data.Text                          (Text)
 import qualified Data.Text                          as T
 import qualified Data.Text.Encoding                 as TE
@@ -54,7 +53,6 @@
 import           Yesod.Core.Internal.Session
 import           Yesod.Core.Widget
 import Data.CaseInsensitive (CI)
-import qualified Network.Wai.Handler.Warp as Warp
 import qualified Network.Wai.Request
 import Data.IORef
 import UnliftIO (SomeException, catch, MonadUnliftIO)
@@ -78,7 +76,7 @@
     --  allows the user to specify how exceptions are cought.
     --  by default all async exceptions are thrown and synchronous
     --  exceptions render a 500 page.
-    -- To catch all exceptions (even async) to render a 500 page, 
+    -- To catch all exceptions (even async) to render a 500 page,
     -- set this to 'UnliftIO.Exception.catchSyncOrAsync'. Beware
     -- this may have negative effects with functions like 'timeout'.
     catchHandlerExceptions :: MonadUnliftIO m => site -> m a -> (SomeException -> m a) -> m a
diff --git a/src/Yesod/Core/Content.hs b/src/Yesod/Core/Content.hs
--- a/src/Yesod/Core/Content.hs
+++ b/src/Yesod/Core/Content.hs
@@ -1,9 +1,10 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE Rank2Types #-}
 {-# LANGUAGE StandaloneDeriving #-}
 {-# LANGUAGE TypeSynonymInstances #-}
-{-# LANGUAGE Rank2Types #-}
-{-# LANGUAGE OverloadedStrings #-}
+
 module Yesod.Core.Content
     ( -- * Content
       Content (..)
diff --git a/src/Yesod/Core/Dispatch.hs b/src/Yesod/Core/Dispatch.hs
--- a/src/Yesod/Core/Dispatch.hs
+++ b/src/Yesod/Core/Dispatch.hs
@@ -4,6 +4,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE TypeFamilies #-}
+
 module Yesod.Core.Dispatch
     ( -- * Quasi-quoted routing
       parseRoutes
diff --git a/src/Yesod/Core/Handler.hs b/src/Yesod/Core/Handler.hs
--- a/src/Yesod/Core/Handler.hs
+++ b/src/Yesod/Core/Handler.hs
@@ -1,15 +1,18 @@
-{-# LANGUAGE FlexibleContexts           #-}
-{-# LANGUAGE ConstraintKinds            #-}
-{-# LANGUAGE FlexibleInstances          #-}
-{-# LANGUAGE FunctionalDependencies     #-}
-{-# LANGUAGE OverloadedStrings          #-}
-{-# LANGUAGE QuasiQuotes                #-}
-{-# LANGUAGE RecordWildCards            #-}
-{-# LANGUAGE TupleSections              #-}
-{-# LANGUAGE TypeFamilies               #-}
-{-# LANGUAGE RankNTypes                 #-}
-{-# LANGUAGE ScopedTypeVariables        #-}
-{-# LANGUAGE TemplateHaskell            #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+
 ---------------------------------------------------------
 --
 -- Module        : Yesod.Handler
@@ -249,7 +252,6 @@
 import           Web.PathPieces                (PathPiece(..))
 import           Yesod.Core.Class.Handler
 import           Yesod.Core.Types
-import           Yesod.Routes.Class            (Route)
 import           Data.ByteString.Builder (Builder)
 import           Data.CaseInsensitive (CI, original)
 import qualified Data.Conduit.List as CL
@@ -415,9 +417,15 @@
           where
             oldReq    = handlerRequest oldHandlerData
             oldWaiReq = reqWaiRequest oldReq
+#if MIN_VERSION_wai(3,2,4)
+            newWaiReq =
+                W.setRequestBodyChunks (return mempty) $
+                    oldWaiReq { W.requestBodyLength = W.KnownLength 0 }
+#else
             newWaiReq = oldWaiReq { W.requestBody = return mempty
                                   , W.requestBodyLength = W.KnownLength 0
                                   }
+#endif
         oldEnv = handlerEnv oldHandlerData
     newState <- liftIO $ do
       oldState <- I.readIORef (handlerState oldHandlerData)
@@ -1434,7 +1442,11 @@
 rawRequestBody = do
     req <- lift waiRequest
     let loop = do
+#if MIN_VERSION_wai(3,2,2)
+            bs <- liftIO $ W.getRequestBodyChunk req
+#else
             bs <- liftIO $ W.requestBody req
+#endif
             unless (S.null bs) $ do
                 yield bs
                 loop
diff --git a/src/Yesod/Core/Internal/LiteApp.hs b/src/Yesod/Core/Internal/LiteApp.hs
--- a/src/Yesod/Core/Internal/LiteApp.hs
+++ b/src/Yesod/Core/Internal/LiteApp.hs
@@ -1,9 +1,8 @@
-{-# LANGUAGE TypeFamilies, PatternGuards, CPP #-}
+{-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module Yesod.Core.Internal.LiteApp where
 
-#if !(MIN_VERSION_base(4,11,0))
-import Data.Semigroup (Semigroup(..))
-#endif
 import Yesod.Routes.Class
 import Yesod.Core.Class.Yesod
 import Yesod.Core.Class.Dispatch
@@ -47,9 +46,6 @@
 
 instance Monoid LiteApp where
     mempty = LiteApp $ \_ _ -> Nothing
-#if !(MIN_VERSION_base(4,11,0))
-    mappend = (<>)
-#endif
 
 type LiteHandler = HandlerFor LiteApp
 type LiteWidget = WidgetFor LiteApp
diff --git a/src/Yesod/Core/Internal/Request.hs b/src/Yesod/Core/Internal/Request.hs
--- a/src/Yesod/Core/Internal/Request.hs
+++ b/src/Yesod/Core/Internal/Request.hs
@@ -1,4 +1,6 @@
-{-# LANGUAGE OverloadedStrings, CPP #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE OverloadedStrings #-}
+
 module Yesod.Core.Internal.Request
     ( parseWaiRequest
     , RequestBodyContents
@@ -49,9 +51,12 @@
 limitRequestBody :: Word64 -> W.Request -> IO W.Request
 limitRequestBody maxLen req = do
     ref <- newIORef maxLen
-    return req
-        { W.requestBody = do
+    let bd = do
+#if MIN_VERSION_wai(3,2,2)
+            bs <- W.getRequestBodyChunk req
+#else
             bs <- W.requestBody req
+#endif
             remaining <- readIORef ref
             let len = fromIntegral $ S8.length bs
                 remaining' = remaining - len
@@ -60,13 +65,17 @@
                 else do
                     writeIORef ref remaining'
                     return bs
-        }
+#if MIN_VERSION_wai(3,2,4)
+    return $ W.setRequestBodyChunks bd req
+#else
+    return req { W.requestBody = bd }
+#endif
 
 tooLargeResponse :: Word64 -> Word64 -> W.Response
 tooLargeResponse maxLen bodyLen = W.responseLBS
     (Status 413 "Too Large")
     [("Content-Type", "text/plain")]
-    (L.concat 
+    (L.concat
         [ "Request body too large to be processed. The maximum size is "
         , (LS8.pack (show maxLen))
         , " bytes; your request body was "
diff --git a/src/Yesod/Core/Internal/Response.hs b/src/Yesod/Core/Internal/Response.hs
--- a/src/Yesod/Core/Internal/Response.hs
+++ b/src/Yesod/Core/Internal/Response.hs
@@ -1,6 +1,5 @@
-{-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RankNTypes        #-}
+
 module Yesod.Core.Internal.Response where
 
 import           Data.ByteString              (ByteString)
diff --git a/src/Yesod/Core/Internal/Run.hs b/src/Yesod/Core/Internal/Run.hs
--- a/src/Yesod/Core/Internal/Run.hs
+++ b/src/Yesod/Core/Internal/Run.hs
@@ -1,11 +1,12 @@
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PatternGuards       #-}
-{-# LANGUAGE RankNTypes          #-}
-{-# LANGUAGE RecordWildCards     #-}
-{-# LANGUAGE TemplateHaskell     #-}
-{-# LANGUAGE TupleSections       #-}
-{-# LANGUAGE FlexibleContexts    #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TupleSections #-}
+
 module Yesod.Core.Internal.Run
   ( toErrorHandler
   , errFromShow
@@ -22,8 +23,7 @@
   )
   where
 
-import qualified Control.Exception as EUnsafe
-import Yesod.Core.Internal.Response
+import           Yesod.Core.Internal.Response
 import           Data.ByteString.Builder      (toLazyByteString)
 import qualified Data.ByteString.Lazy         as BL
 import           Control.Monad.IO.Class       (MonadIO, liftIO)
@@ -43,7 +43,6 @@
 import           Language.Haskell.TH.Syntax   (Loc, qLocation)
 import qualified Network.HTTP.Types           as H
 import           Network.Wai
-import           Network.Wai.Internal
 import           System.Log.FastLogger        (LogStr, toLogStr)
 import           Yesod.Core.Content
 import           Yesod.Core.Class.Yesod
@@ -51,11 +50,9 @@
 import           Yesod.Core.Internal.Request  (parseWaiRequest,
                                                tooLargeResponse)
 import           Yesod.Core.Internal.Util     (getCurrentMaxExpiresRFC1123)
-import           Yesod.Routes.Class           (Route, renderRoute)
+import           Yesod.Routes.Class           (RenderRoute (..))
 import           Control.DeepSeq              (($!!), NFData)
 import           UnliftIO.Exception
-import           UnliftIO(MonadUnliftIO, withRunInIO)
-import           Data.Proxy(Proxy(..))
 
 -- | Convert a synchronous exception into an ErrorResponse
 toErrorHandler :: SomeException -> IO ErrorResponse
@@ -288,23 +285,12 @@
                      typePlain
                      (toContent ("runFakeHandler: errHandler" :: S8.ByteString))
                      (reqSession req)
-      fakeWaiRequest = Request
+      fakeWaiRequest = defaultRequest
           { requestMethod  = "POST"
           , httpVersion    = H.http11
           , rawPathInfo    = "/runFakeHandler/pathInfo"
-          , rawQueryString = ""
-          , requestHeaderHost = Nothing
-          , requestHeaders = []
-          , isSecure       = False
           , remoteHost     = error "runFakeHandler-remoteHost"
           , pathInfo       = ["runFakeHandler", "pathInfo"]
-          , queryString    = []
-          , requestBody    = return mempty
-          , vault          = mempty
-          , requestBodyLength = KnownLength 0
-          , requestHeaderRange = Nothing
-          , requestHeaderReferer = Nothing
-          , requestHeaderUserAgent = Nothing
           }
       fakeRequest =
         YesodRequest
@@ -365,7 +351,6 @@
           yar <- runInternalState (runHandler rhe handler yreq') is
           yarToResponse yar saveSession yreq' req is sendResponse
   where
-    mmaxLen = maximumContentLength yreSite route
     handler = yesodMiddleware handler'
 
 yesodRender :: Yesod y
diff --git a/src/Yesod/Core/Internal/TH.hs b/src/Yesod/Core/Internal/TH.hs
--- a/src/Yesod/Core/Internal/TH.hs
+++ b/src/Yesod/Core/Internal/TH.hs
@@ -1,10 +1,11 @@
-{-# LANGUAGE TemplateHaskellQuotes #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE TemplateHaskellQuotes #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module Yesod.Core.Internal.TH
     ( mkYesod
     , mkYesodOpts
@@ -32,7 +33,7 @@
     , mkDispatchInstance
 
     , mkYesodSubDispatch
-    
+
     , subTopDispatch
     , instanceD
 
@@ -69,7 +70,7 @@
 -- is used for creating sites, /not/ subsites. See 'mkYesodSubData' and 'mkYesodSubDispatch' for the latter.
 -- Use 'parseRoutes' to create the 'Resource's.
 --
--- Contexts and type variables in the name of the datatype are parsed. 
+-- Contexts and type variables in the name of the datatype are parsed.
 -- For example, a datatype @App a@ with typeclass constraint @MyClass a@ can be written as @\"(MyClass a) => App a\"@.
 mkYesod :: String -- ^ name of the argument datatype
         -> [ResourceTree String]
@@ -87,8 +88,8 @@
 
 
 {-# DEPRECATED mkYesodWith "Contexts and type variables are now parsed from the name in `mkYesod`. <https://github.com/yesodweb/yesod/pull/1366>" #-}
--- | Similar to 'mkYesod', except contexts and type variables are not parsed. 
--- Instead, they are explicitly provided. 
+-- | Similar to 'mkYesod', except contexts and type variables are not parsed.
+-- Instead, they are explicitly provided.
 -- You can write @(MyClass a) => App a@ with @mkYesodWith [[\"MyClass\",\"a\"]] \"App\" [\"a\"] ...@.
 mkYesodWith :: [[String]] -- ^ list of contexts
             -> String -- ^ name of the argument datatype
@@ -172,7 +173,7 @@
             _ <- char ')'
             return r
 
-        parseContexts = 
+        parseContexts =
             sepBy1 (many1 parseWord) (spaces >> char ',' >> return ())
 
 
@@ -218,8 +219,11 @@
                    -> [ResourceTree String]
                    -> Q([Dec],[Dec])
 mkYesodGeneralOpts opts appCxt' namestr mtys isSub f resS = do
-    let appCxt = fmap (\(c:rest) -> 
-            foldl' (\acc v -> acc `AppT` nameToType v) (ConT $ mkName c) rest
+    let appCxt = fmap (\ctxs ->
+            case ctxs of
+                c:rest ->
+                    foldl' (\acc v -> acc `AppT` nameToType v) (ConT $ mkName c) rest
+                [] -> error $ "Bad context: " ++ show ctxs
           ) appCxt'
     mname <- lookupTypeName namestr
     arity <- case mname of
@@ -289,11 +293,11 @@
                    -> [ResourceTree c]          -- ^ The resource
                    -> DecsQ
 mkDispatchInstance master cxt f res = do
-    clause' <- 
-        mkDispatchClause 
-            (mkMDS 
-                f 
-                [|yesodRunner|] 
+    clause' <-
+        mkDispatchClause
+            (mkMDS
+                f
+                [|yesodRunner|]
                 [|\parentRunner getSub toParent env -> yesodSubDispatch
                     YesodSubRunnerEnv
                     { ysreParentRunner = parentRunner
@@ -311,12 +315,12 @@
 
 mkYesodSubDispatch :: [ResourceTree a] -> Q Exp
 mkYesodSubDispatch res = do
-    clause' <- 
+    clause' <-
         mkDispatchClause
-            (mkMDS 
-                return 
-                [|subHelper|] 
-                [|subTopDispatch|]) 
+            (mkMDS
+                return
+                [|subHelper|]
+                [|subTopDispatch|])
         res
     inner <- newName "inner"
     let innerFun = FunD inner [clause']
@@ -330,7 +334,7 @@
     return $ LetE [fun] (VarE helper)
 
 
-subTopDispatch :: 
+subTopDispatch ::
     (YesodSubDispatch sub master) =>
         (forall content. ToTypedContent content =>
             SubHandlerFor child master content ->
diff --git a/src/Yesod/Core/Internal/Util.hs b/src/Yesod/Core/Internal/Util.hs
--- a/src/Yesod/Core/Internal/Util.hs
+++ b/src/Yesod/Core/Internal/Util.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP #-}
 module Yesod.Core.Internal.Util
     ( putTime
     , getTime
diff --git a/src/Yesod/Core/Json.hs b/src/Yesod/Core/Json.hs
--- a/src/Yesod/Core/Json.hs
+++ b/src/Yesod/Core/Json.hs
@@ -1,6 +1,6 @@
-{-# LANGUAGE TypeSynonymInstances, OverloadedStrings #-}
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE OverloadedStrings #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
+
 module Yesod.Core.Json
     ( -- * Convert from a JSON value
       defaultLayoutJson
diff --git a/src/Yesod/Core/TypeCache.hs b/src/Yesod/Core/TypeCache.hs
--- a/src/Yesod/Core/TypeCache.hs
+++ b/src/Yesod/Core/TypeCache.hs
diff --git a/src/Yesod/Core/Types.hs b/src/Yesod/Core/Types.hs
--- a/src/Yesod/Core/Types.hs
+++ b/src/Yesod/Core/Types.hs
@@ -1,14 +1,14 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveFunctor #-}
 {-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE TupleSections #-}
-{-# LANGUAGE FlexibleInstances          #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE MultiParamTypeClasses      #-}
-{-# LANGUAGE TypeFamilies               #-}
-{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+
 module Yesod.Core.Types where
 
 import Data.Aeson (ToJSON)
@@ -29,7 +29,6 @@
 import           Data.Map                           (Map, unionWith)
 import qualified Data.Map                           as Map
 import           Data.Monoid                        (Endo (..), Last (..))
-import           Data.Semigroup                     (Semigroup(..))
 import           Data.Serialize                     (Serialize (..),
                                                      putByteString)
 import           Data.String                        (IsString (fromString))
@@ -261,9 +260,6 @@
 
 instance a ~ () => Monoid (WidgetFor site a) where
     mempty = return ()
-#if !(MIN_VERSION_base(4,11,0))
-    mappend = (<>)
-#endif
 instance a ~ () => Semigroup (WidgetFor site a) where
     x <> y = x >> y
 
@@ -397,13 +393,9 @@
 newtype Description = Description { unDescription :: Text }
 
 newtype Head url = Head (HtmlUrl url)
-    deriving Monoid
-instance Semigroup (Head url) where
-  (<>) = mappend
+    deriving (Semigroup, Monoid)
 newtype Body url = Body (HtmlUrl url)
-    deriving Monoid
-instance Semigroup (Body url) where
-  (<>) = mappend
+    deriving (Semigroup, Monoid)
 
 type CssBuilderUrl a = (a -> [(Text, Text)] -> Text) -> TBuilder.Builder
 
@@ -419,9 +411,6 @@
     }
 instance Monoid (GWData a) where
     mempty = GWData mempty mempty mempty mempty mempty mempty mempty mempty
-#if !(MIN_VERSION_base(4,11,0))
-    mappend = (<>)
-#endif
 instance Semigroup (GWData a) where
     GWData a1 a2 a3 a4 a5 a6 a7 a8 <>
       GWData b1 b2 b3 b4 b5 b6 b7 b8 = GWData
@@ -526,9 +515,6 @@
 
 instance Monoid (UniqueList x) where
     mempty = UniqueList id
-#if !(MIN_VERSION_base(4,11,0))
-    mappend = (<>)
-#endif
 instance Semigroup (UniqueList x) where
     UniqueList x <> UniqueList y = UniqueList $ x . y
 
diff --git a/src/Yesod/Core/Widget.hs b/src/Yesod/Core/Widget.hs
--- a/src/Yesod/Core/Widget.hs
+++ b/src/Yesod/Core/Widget.hs
@@ -1,14 +1,15 @@
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE TupleSections #-}
-{-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE TypeSynonymInstances #-}
 {-# LANGUAGE UndecidableInstances #-}
-{-# LANGUAGE QuasiQuotes #-}
 
 -- | Widgets combine HTML with JS and CSS dependencies with a unique identifier
 -- generator, allowing you to create truly modular HTML components.
@@ -57,7 +58,7 @@
     , asWidgetT
     ) where
 
-import Data.Monoid
+import Data.Monoid (Last (..))
 import qualified Text.Blaze.Html5 as H
 import Text.Hamlet
 import Text.Cassius
diff --git a/src/Yesod/Routes/Class.hs b/src/Yesod/Routes/Class.hs
--- a/src/Yesod/Routes/Class.hs
+++ b/src/Yesod/Routes/Class.hs
@@ -1,5 +1,6 @@
-{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module Yesod.Routes.Class
     ( RenderRoute (..)
     , ParseRoute (..)
diff --git a/src/Yesod/Routes/Parse.hs b/src/Yesod/Routes/Parse.hs
--- a/src/Yesod/Routes/Parse.hs
+++ b/src/Yesod/Routes/Parse.hs
@@ -1,6 +1,7 @@
-{-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE TemplateHaskell #-}
 {-# OPTIONS_GHC -fno-warn-missing-fields #-} -- QuasiQuoter
+
 module Yesod.Routes.Parse
     ( parseRoutes
     , parseRoutesFile
@@ -100,7 +101,11 @@
                     , Just attrs <- mapM parseAttr rest ->
                     let (children, otherLines'') = parse (length spaces + 1) otherLines
                         children' = addAttrs attrs children
-                        (pieces, Nothing, check) = piecesFromStringCheck pattern
+                        (pieces, check) =
+                            case piecesFromStringCheck pattern of
+                                (p, Nothing, c) -> (p, c)
+                                -- FIXME: Give better error message
+                                _ -> error "Invalid resource line: bad overlap"
                      in ((ResourceParent constr check pieces children' :), otherLines'')
                 (pattern:constr:rest) ->
                     let (pieces, mmulti, check) = piecesFromStringCheck pattern
@@ -113,11 +118,11 @@
 -- | Splits a string by spaces, as long as the spaces are not enclosed by curly brackets (not recursive).
 splitSpaces :: String -> [String]
 splitSpaces "" = []
-splitSpaces str = 
+splitSpaces str =
     let (rest, piece) = parse $ dropWhile isSpace str in
     piece:(splitSpaces rest)
 
-    where 
+    where
         parse :: String -> ( String, String)
         parse ('{':s) = fmap ('{':) $ parseBracket s
         parse (c:s) | isSpace c = (s, [])
@@ -302,6 +307,6 @@
 lineContinuations :: String -> [String] -> [String]
 lineContinuations this [] = [this]
 lineContinuations this below@(next:rest) = case unsnoc this of
-    Just (this', '\\') -> (this'++next):rest
+    Just (this', '\\') -> (this' ++ next):rest
     _ -> this:below
   where unsnoc s = if null s then Nothing else Just (init s, last s)
diff --git a/src/Yesod/Routes/TH/Dispatch.hs b/src/Yesod/Routes/TH/Dispatch.hs
--- a/src/Yesod/Routes/TH/Dispatch.hs
+++ b/src/Yesod/Routes/TH/Dispatch.hs
@@ -1,5 +1,8 @@
 {-# LANGUAGE CPP #-}
-{-# LANGUAGE RecordWildCards, TemplateHaskell, ViewPatterns #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE ViewPatterns #-}
+
 module Yesod.Routes.TH.Dispatch
     ( MkDispatchSettings (..)
     , mkDispatchClause
diff --git a/src/Yesod/Routes/TH/ParseRoute.hs b/src/Yesod/Routes/TH/ParseRoute.hs
--- a/src/Yesod/Routes/TH/ParseRoute.hs
+++ b/src/Yesod/Routes/TH/ParseRoute.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE TemplateHaskell #-}
+
 module Yesod.Routes.TH.ParseRoute
     ( -- ** ParseRoute
       mkParseRouteInstance
diff --git a/src/Yesod/Routes/TH/RenderRoute.hs b/src/Yesod/Routes/TH/RenderRoute.hs
--- a/src/Yesod/Routes/TH/RenderRoute.hs
+++ b/src/Yesod/Routes/TH/RenderRoute.hs
@@ -1,6 +1,6 @@
-{-# LANGUAGE TupleSections #-}
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE TemplateHaskellQuotes #-}
+{-# LANGUAGE TupleSections #-}
 
 module Yesod.Routes.TH.RenderRoute
     ( -- ** RenderRoute
diff --git a/src/Yesod/Routes/TH/RouteAttrs.hs b/src/Yesod/Routes/TH/RouteAttrs.hs
--- a/src/Yesod/Routes/TH/RouteAttrs.hs
+++ b/src/Yesod/Routes/TH/RouteAttrs.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE CPP #-}
-{-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE TemplateHaskell #-}
+
 module Yesod.Routes.TH.RouteAttrs
     ( mkRouteAttrsInstance
     ) where
diff --git a/src/Yesod/Routes/TH/Types.hs b/src/Yesod/Routes/TH/Types.hs
--- a/src/Yesod/Routes/TH/Types.hs
+++ b/src/Yesod/Routes/TH/Types.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE DeriveFunctor #-}
 {-# LANGUAGE DeriveLift #-}
+
 -- | Warning! This module is considered internal and may have breaking changes
 module Yesod.Routes.TH.Types
     ( -- * Data types
diff --git a/test/Hierarchy.hs b/test/Hierarchy.hs
--- a/test/Hierarchy.hs
+++ b/test/Hierarchy.hs
@@ -1,13 +1,14 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeSynonymInstances #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE ViewPatterns #-}
-{-# LANGUAGE CPP #-}
+
 module Hierarchy
     ( hierarchy
     , Dispatcher (..)
@@ -127,11 +128,10 @@
         , mdsGetHandler = defaultGetHandler
         , mdsUnwrapper = return
         } resources
-    return
+    return $
+        InstanceD
 #if MIN_VERSION_template_haskell(2,11,0)
-        $ InstanceD Nothing
-#else
-        $ InstanceD
+            Nothing
 #endif
             []
             (ConT ''Dispatcher
diff --git a/test/RouteSpec.hs b/test/RouteSpec.hs
--- a/test/RouteSpec.hs
+++ b/test/RouteSpec.hs
@@ -1,17 +1,18 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ViewPatterns#-}
-{-# LANGUAGE RecordWildCards #-}
-{-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE ExistentialQuantification #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE TypeSynonymInstances #-}
-{-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# OPTIONS_GHC -ddump-splices #-}
+{-# LANGUAGE ViewPatterns#-}
+-- {-# OPTIONS_GHC -ddump-splices #-}
+
 import Test.Hspec
 import Test.HUnit ((@?=))
 import Data.Text (Text, pack, unpack, singleton)
@@ -86,11 +87,10 @@
         , mdsGetHandler = defaultGetHandler
         , mdsUnwrapper = return
         } ress
-    return
+    return $
+        InstanceD
 #if MIN_VERSION_template_haskell(2,11,0)
-        $ InstanceD Nothing
-#else
-        $ InstanceD
+            Nothing
 #endif
             []
             (ConT ''Dispatcher
diff --git a/test/YesodCoreTest.hs b/test/YesodCoreTest.hs
--- a/test/YesodCoreTest.hs
+++ b/test/YesodCoreTest.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE CPP                        #-}
+{-# LANGUAGE CPP #-}
+
 module YesodCoreTest (specs) where
 
 import YesodCoreTest.CleanPath
@@ -23,7 +24,7 @@
 import qualified YesodCoreTest.Json as Json
 
 -- Skip on Windows, see https://github.com/yesodweb/yesod/issues/1523#issuecomment-398278450
-#if !WINDOWS
+#ifndef WINDOWS
 import qualified YesodCoreTest.RawResponse as RawResponse
 #endif
 
@@ -56,7 +57,7 @@
       JsLoader.specs
       RequestBodySize.specs
       Json.specs
-#if !WINDOWS
+#ifndef WINDOWS
       RawResponse.specs
 #endif
       Streaming.specs
diff --git a/test/YesodCoreTest/Auth.hs b/test/YesodCoreTest/Auth.hs
--- a/test/YesodCoreTest/Auth.hs
+++ b/test/YesodCoreTest/Auth.hs
@@ -1,4 +1,9 @@
-{-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, TypeFamilies, MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.Auth
     ( specs
     , Widget
diff --git a/test/YesodCoreTest/Breadcrumb.hs b/test/YesodCoreTest/Breadcrumb.hs
--- a/test/YesodCoreTest/Breadcrumb.hs
+++ b/test/YesodCoreTest/Breadcrumb.hs
@@ -5,19 +5,17 @@
 {-# LANGUAGE Rank2Types #-}
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# OPTIONS_GHC -Wno-unused-top-binds #-}
 
 module YesodCoreTest.Breadcrumb
   ( breadcrumbTest,
   )
 where
 
-import qualified Data.ByteString.Lazy.Char8 as L8
 import Data.Text (Text)
-import Data.Typeable (Typeable)
 import Network.Wai
 import Network.Wai.Test
 import Test.Hspec
-import UnliftIO.IORef
 import Yesod.Core
 
 data A = A
diff --git a/test/YesodCoreTest/Cache.hs b/test/YesodCoreTest/Cache.hs
--- a/test/YesodCoreTest/Cache.hs
+++ b/test/YesodCoreTest/Cache.hs
@@ -1,7 +1,11 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE Rank2Types #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.Cache
     ( cacheTest
     , Widget
diff --git a/test/YesodCoreTest/CleanPath.hs b/test/YesodCoreTest/CleanPath.hs
--- a/test/YesodCoreTest/CleanPath.hs
+++ b/test/YesodCoreTest/CleanPath.hs
@@ -1,7 +1,11 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE FlexibleInstances, ViewPatterns #-}
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
+
 module YesodCoreTest.CleanPath
     ( cleanPathTest
     , Widget
@@ -21,7 +25,6 @@
 import qualified Data.Text.Encoding as TE
 import Control.Arrow ((***))
 import Network.HTTP.Types (encodePath)
-import Data.Monoid (mappend)
 import Data.Text.Encoding (encodeUtf8Builder)
 
 data Subsite = Subsite
@@ -64,7 +67,7 @@
         corrected = filter (not . TS.null) s
 
     joinPath Y ar pieces' qs' =
-        encodeUtf8Builder ar `Data.Monoid.mappend` encodePath pieces qs
+        encodeUtf8Builder ar `mappend` encodePath pieces qs
       where
         pieces = if null pieces' then [""] else pieces'
         qs = map (TE.encodeUtf8 *** go) qs'
diff --git a/test/YesodCoreTest/Csrf.hs b/test/YesodCoreTest/Csrf.hs
--- a/test/YesodCoreTest/Csrf.hs
+++ b/test/YesodCoreTest/Csrf.hs
@@ -1,4 +1,8 @@
-{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
 
 module YesodCoreTest.Csrf (csrfSpec, Widget, resourcesApp) where
 
@@ -10,7 +14,6 @@
 import Web.Cookie
 import qualified Data.Map as Map
 import Data.ByteString.Lazy (fromStrict)
-import Data.Monoid ((<>))
 
 data App = App
 
@@ -79,7 +82,7 @@
 
         res <- request (defaultRequest { requestMethod = "POST", requestHeaders = [(defaultCsrfHeaderName, csrfValue <> "foo")] })
         assertStatus 403 res
-        
+
     it "403s write requests with the wrong CSRF param" $ runner $ do
         getRes <- request defaultRequest
         assertStatus 200 getRes
diff --git a/test/YesodCoreTest/ErrorHandling.hs b/test/YesodCoreTest/ErrorHandling.hs
--- a/test/YesodCoreTest/ErrorHandling.hs
+++ b/test/YesodCoreTest/ErrorHandling.hs
@@ -1,7 +1,11 @@
-{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE ViewPatterns #-}
-{-# LANGUAGE LambdaCase #-}
 
 module YesodCoreTest.ErrorHandling
     ( errorHandlingTest
@@ -10,7 +14,6 @@
     ) where
 
 import  Data.Typeable(cast)
-import qualified System.Mem as Mem
 import qualified Control.Concurrent.Async as Async
 import Control.Concurrent as Conc
 import Yesod.Core
@@ -20,10 +23,8 @@
 import qualified Data.ByteString.Lazy as L
 import qualified Data.ByteString.Char8 as S8
 import Control.Exception (SomeException, try, AsyncException(..))
-import           UnliftIO.Exception(finally)
 import Network.HTTP.Types (Status, mkStatus)
 import Data.ByteString.Builder (Builder, toLazyByteString)
-import Data.Monoid (mconcat)
 import Data.Text (Text, pack)
 import Control.Monad (forM_)
 import qualified Network.Wai.Handler.Warp as Warp
@@ -121,7 +122,7 @@
 getFileBadNameR = return $ TypedContent "ignored" $ ContentFile (error "filebadname") Nothing
 
 goodBuilderContent :: Builder
-goodBuilderContent = Data.Monoid.mconcat $ replicate 100 $ "This is a test\n"
+goodBuilderContent = mconcat $ replicate 100 $ "This is a test\n"
 
 getGoodBuilderR :: Handler TypedContent
 getGoodBuilderR = return $ TypedContent "text/plain" $ toContent goodBuilderContent
diff --git a/test/YesodCoreTest/ErrorHandling/CustomApp.hs b/test/YesodCoreTest/ErrorHandling/CustomApp.hs
--- a/test/YesodCoreTest/ErrorHandling/CustomApp.hs
+++ b/test/YesodCoreTest/ErrorHandling/CustomApp.hs
@@ -1,8 +1,12 @@
-{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE ViewPatterns #-}
-{-# LANGUAGE LambdaCase #-}
-{-# LANGUAGE DeriveAnyClass #-}
 
 -- | a custom app that throws an exception
 module YesodCoreTest.ErrorHandling.CustomApp
@@ -14,8 +18,6 @@
     , resourcesCustomApp
     ) where
 
-
-import Yesod.Core.Types
 import Yesod.Core
 import qualified UnliftIO.Exception as E
 
diff --git a/test/YesodCoreTest/Exceptions.hs b/test/YesodCoreTest/Exceptions.hs
--- a/test/YesodCoreTest/Exceptions.hs
+++ b/test/YesodCoreTest/Exceptions.hs
@@ -1,6 +1,10 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.Exceptions
     ( exceptionsTest
     , Widget
diff --git a/test/YesodCoreTest/Header.hs b/test/YesodCoreTest/Header.hs
--- a/test/YesodCoreTest/Header.hs
+++ b/test/YesodCoreTest/Header.hs
@@ -1,5 +1,9 @@
-{-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes,
-  TypeFamilies, MultiParamTypeClasses, ViewPatterns #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
 
 module YesodCoreTest.Header
   ( headerTest
diff --git a/test/YesodCoreTest/InternalRequest.hs b/test/YesodCoreTest/InternalRequest.hs
--- a/test/YesodCoreTest/InternalRequest.hs
+++ b/test/YesodCoreTest/InternalRequest.hs
@@ -1,20 +1,20 @@
 {-# LANGUAGE OverloadedStrings #-}
+
 module YesodCoreTest.InternalRequest (internalRequestTest) where
 
 import Data.List (nub)
 import Network.Wai as W
 import Yesod.Core.Internal (randomString, parseWaiRequest)
 import Test.Hspec
-import Data.Monoid (mempty)
 import Data.Map (singleton)
 import Yesod.Core
 import Data.Word (Word64)
 import System.IO.Unsafe (unsafePerformIO)
 import Control.Monad (replicateM)
-import System.Random
+import System.Random (randomIO)
 
 gen :: IO Int
-gen = getStdRandom next
+gen = randomIO
 
 randomStringSpecs :: Spec
 randomStringSpecs = describe "Yesod.Internal.Request.randomString" $ do
@@ -57,7 +57,7 @@
 
 noDisabledToken :: Bool
 noDisabledToken = reqToken r == Nothing where
-  r = parseWaiRequest' defaultRequest Data.Monoid.mempty False 1000
+  r = parseWaiRequest' defaultRequest mempty False 1000
 
 ignoreDisabledToken :: Bool
 ignoreDisabledToken = reqToken r == Nothing where
diff --git a/test/YesodCoreTest/JsAttributes.hs b/test/YesodCoreTest/JsAttributes.hs
--- a/test/YesodCoreTest/JsAttributes.hs
+++ b/test/YesodCoreTest/JsAttributes.hs
@@ -1,6 +1,10 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.JsAttributes
     ( specs
       -- To avoid unused warning
@@ -34,4 +38,3 @@
 
 runner :: YesodDispatch master => master -> Session () -> IO ()
 runner app f = toWaiApp app >>= runSession f
-
diff --git a/test/YesodCoreTest/JsLoader.hs b/test/YesodCoreTest/JsLoader.hs
--- a/test/YesodCoreTest/JsLoader.hs
+++ b/test/YesodCoreTest/JsLoader.hs
@@ -1,6 +1,10 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.JsLoader
     ( specs
     , Widget
diff --git a/test/YesodCoreTest/JsLoaderSites/Bottom.hs b/test/YesodCoreTest/JsLoaderSites/Bottom.hs
--- a/test/YesodCoreTest/JsLoaderSites/Bottom.hs
+++ b/test/YesodCoreTest/JsLoaderSites/Bottom.hs
@@ -1,6 +1,10 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.JsLoaderSites.Bottom
     ( B(..)
     , Widget
diff --git a/test/YesodCoreTest/Json.hs b/test/YesodCoreTest/Json.hs
--- a/test/YesodCoreTest/Json.hs
+++ b/test/YesodCoreTest/Json.hs
@@ -1,4 +1,10 @@
-{-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, TypeFamilies, MultiParamTypeClasses, ViewPatterns #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
+
 module YesodCoreTest.Json
     ( specs
     , Widget
diff --git a/test/YesodCoreTest/Links.hs b/test/YesodCoreTest/Links.hs
--- a/test/YesodCoreTest/Links.hs
+++ b/test/YesodCoreTest/Links.hs
@@ -1,6 +1,11 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE FlexibleInstances, ViewPatterns #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
+
 module YesodCoreTest.Links
     ( linksTest
     , Widget
diff --git a/test/YesodCoreTest/LiteApp.hs b/test/YesodCoreTest/LiteApp.hs
--- a/test/YesodCoreTest/LiteApp.hs
+++ b/test/YesodCoreTest/LiteApp.hs
@@ -1,3 +1,4 @@
+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
 module YesodCoreTest.LiteApp (specs) where
 
 import Yesod.Core
diff --git a/test/YesodCoreTest/Media.hs b/test/YesodCoreTest/Media.hs
--- a/test/YesodCoreTest/Media.hs
+++ b/test/YesodCoreTest/Media.hs
@@ -1,7 +1,12 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE FlexibleInstances, ViewPatterns #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
+
 module YesodCoreTest.Media (mediaTest, Widget) where
 
 import Test.Hspec
diff --git a/test/YesodCoreTest/MediaData.hs b/test/YesodCoreTest/MediaData.hs
--- a/test/YesodCoreTest/MediaData.hs
+++ b/test/YesodCoreTest/MediaData.hs
@@ -1,6 +1,10 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.MediaData where
 
 import Yesod.Core
diff --git a/test/YesodCoreTest/Meta.hs b/test/YesodCoreTest/Meta.hs
--- a/test/YesodCoreTest/Meta.hs
+++ b/test/YesodCoreTest/Meta.hs
@@ -5,6 +5,7 @@
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE ViewPatterns #-}
+{-# OPTIONS_GHC -Wno-unused-top-binds #-}
 
 module YesodCoreTest.Meta
     ( metaTest
diff --git a/test/YesodCoreTest/NoOverloadedStrings.hs b/test/YesodCoreTest/NoOverloadedStrings.hs
--- a/test/YesodCoreTest/NoOverloadedStrings.hs
+++ b/test/YesodCoreTest/NoOverloadedStrings.hs
@@ -1,7 +1,13 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
-{-# LANGUAGE FlexibleInstances, ViewPatterns #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings #-} -- the module name is a lie!!!
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
+{-# LANGUAGE TypeOperators #-}
+
 module YesodCoreTest.NoOverloadedStrings
     ( noOverloadedTest
     , Widget
@@ -14,7 +20,6 @@
 import Yesod.Core
 import Network.Wai
 import Network.Wai.Test
-import Data.Monoid (mempty)
 import qualified Data.Text as T
 import qualified Data.ByteString.Lazy.Char8 as L8
 
@@ -65,7 +70,7 @@
 case_sanity :: IO ()
 case_sanity = runner $ do
     res <- request defaultRequest
-    assertBody Data.Monoid.mempty res
+    assertBody mempty res
 
 case_subsite :: IO ()
 case_subsite = runner $ do
diff --git a/test/YesodCoreTest/NoOverloadedStringsSub.hs b/test/YesodCoreTest/NoOverloadedStringsSub.hs
--- a/test/YesodCoreTest/NoOverloadedStringsSub.hs
+++ b/test/YesodCoreTest/NoOverloadedStringsSub.hs
@@ -1,8 +1,12 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-} -- hah, the test should be renamed...
+{-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE ViewPatterns #-}
-{-# LANGUAGE OverloadedStrings #-} -- hah, the test should be renamed...
+
 -- Not actually a problem, we're now requiring overloaded strings, we just need
 -- to make the docs more explicit about it.
 module YesodCoreTest.NoOverloadedStringsSub where
diff --git a/test/YesodCoreTest/ParameterizedSite.hs b/test/YesodCoreTest/ParameterizedSite.hs
--- a/test/YesodCoreTest/ParameterizedSite.hs
+++ b/test/YesodCoreTest/ParameterizedSite.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+
 module YesodCoreTest.ParameterizedSite
     ( parameterizedSiteTest
     ) where
@@ -17,7 +18,7 @@
 parameterizedSiteTest :: Spec
 parameterizedSiteTest = describe "Polymorphic Yesod sites" $ do
     it "Polymorphic unconstrained stub" $ runStub (PolyAny ())
-    it "Polymorphic stub with Show" $ runStub' "1337" (PolyShow 1337)
+    it "Polymorphic stub with Show" $ runStub' "1337" (PolyShow (1337 :: Int))
     it "Polymorphic unconstrained stub, old-style" $ runStub (Compat () ())
 
 runStub :: YesodDispatch a => a -> IO ()
diff --git a/test/YesodCoreTest/ParameterizedSite/Compat.hs b/test/YesodCoreTest/ParameterizedSite/Compat.hs
--- a/test/YesodCoreTest/ParameterizedSite/Compat.hs
+++ b/test/YesodCoreTest/ParameterizedSite/Compat.hs
@@ -1,7 +1,12 @@
-{-# LANGUAGE
-    TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses
-  , OverloadedStrings, StandaloneDeriving, FlexibleInstances
-  #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# OPTIONS_GHC -Wno-unused-top-binds #-}
+
 module YesodCoreTest.ParameterizedSite.Compat
     ( Compat (..)
     ) where
@@ -24,4 +29,3 @@
         <p>
             Stub
     |]
-
diff --git a/test/YesodCoreTest/ParameterizedSite/PolyAny.hs b/test/YesodCoreTest/ParameterizedSite/PolyAny.hs
--- a/test/YesodCoreTest/ParameterizedSite/PolyAny.hs
+++ b/test/YesodCoreTest/ParameterizedSite/PolyAny.hs
@@ -1,7 +1,12 @@
-{-# LANGUAGE
-    TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses
-  , OverloadedStrings, StandaloneDeriving, FlexibleInstances
-  #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# OPTIONS_GHC -Wno-unused-top-binds #-}
+
 module YesodCoreTest.ParameterizedSite.PolyAny
     ( PolyAny (..)
     ) where
@@ -23,4 +28,3 @@
         <p>
             Stub
     |]
-
diff --git a/test/YesodCoreTest/ParameterizedSite/PolyShow.hs b/test/YesodCoreTest/ParameterizedSite/PolyShow.hs
--- a/test/YesodCoreTest/ParameterizedSite/PolyShow.hs
+++ b/test/YesodCoreTest/ParameterizedSite/PolyShow.hs
@@ -1,7 +1,12 @@
-{-# LANGUAGE
-    TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses
-  , OverloadedStrings, StandaloneDeriving, FlexibleInstances
-  #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# OPTIONS_GHC -Wno-unused-top-binds #-}
+
 module YesodCoreTest.ParameterizedSite.PolyShow
     ( PolyShow (..)
     ) where
@@ -25,4 +30,3 @@
             <p>
                 Stub #{show x}
         |]
-
diff --git a/test/YesodCoreTest/RawResponse.hs b/test/YesodCoreTest/RawResponse.hs
--- a/test/YesodCoreTest/RawResponse.hs
+++ b/test/YesodCoreTest/RawResponse.hs
@@ -1,4 +1,10 @@
-{-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, TypeFamilies, MultiParamTypeClasses, ScopedTypeVariables #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.RawResponse
     ( specs
     , Widget
diff --git a/test/YesodCoreTest/Redirect.hs b/test/YesodCoreTest/Redirect.hs
--- a/test/YesodCoreTest/Redirect.hs
+++ b/test/YesodCoreTest/Redirect.hs
@@ -1,4 +1,9 @@
-{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, MultiParamTypeClasses, OverloadedStrings #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.Redirect
     ( specs
     , Widget
diff --git a/test/YesodCoreTest/Reps.hs b/test/YesodCoreTest/Reps.hs
--- a/test/YesodCoreTest/Reps.hs
+++ b/test/YesodCoreTest/Reps.hs
@@ -1,4 +1,10 @@
-{-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, TypeFamilies, MultiParamTypeClasses, ViewPatterns #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
+
 module YesodCoreTest.Reps
     ( specs
     , Widget
diff --git a/test/YesodCoreTest/RequestBodySize.hs b/test/YesodCoreTest/RequestBodySize.hs
--- a/test/YesodCoreTest/RequestBodySize.hs
+++ b/test/YesodCoreTest/RequestBodySize.hs
@@ -1,6 +1,10 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.RequestBodySize
     ( specs
     , Widget
diff --git a/test/YesodCoreTest/Ssl.hs b/test/YesodCoreTest/Ssl.hs
--- a/test/YesodCoreTest/Ssl.hs
+++ b/test/YesodCoreTest/Ssl.hs
@@ -1,4 +1,9 @@
-{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.Ssl ( sslOnlySpec, unsecSpec, sameSiteSpec ) where
 import qualified YesodCoreTest.StubSslOnly as Ssl
 import qualified YesodCoreTest.StubLaxSameSite as LaxSameSite
@@ -43,7 +48,7 @@
     cookiesIn r =
       DL.map
         (Cookie.parseSetCookie . snd)
-        (DL.filter (("Set-Cookie"==) . fst) $ simpleHeaders r)
+        (DL.filter (("Set-Cookie" ==) . fst) $ simpleHeaders r)
 
 sslOnlySpec :: Spec
 sslOnlySpec = describe "A Yesod application with sslOnly on" $ do
diff --git a/test/YesodCoreTest/Streaming.hs b/test/YesodCoreTest/Streaming.hs
--- a/test/YesodCoreTest/Streaming.hs
+++ b/test/YesodCoreTest/Streaming.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+
 module YesodCoreTest.Streaming (specs) where
 
 import Yesod.Core
diff --git a/test/YesodCoreTest/StubLaxSameSite.hs b/test/YesodCoreTest/StubLaxSameSite.hs
--- a/test/YesodCoreTest/StubLaxSameSite.hs
+++ b/test/YesodCoreTest/StubLaxSameSite.hs
@@ -1,4 +1,9 @@
-{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.StubLaxSameSite
     ( App ( App )
     , Widget
diff --git a/test/YesodCoreTest/StubSslOnly.hs b/test/YesodCoreTest/StubSslOnly.hs
--- a/test/YesodCoreTest/StubSslOnly.hs
+++ b/test/YesodCoreTest/StubSslOnly.hs
@@ -1,4 +1,9 @@
-{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.StubSslOnly
     ( App ( App )
     , Widget
diff --git a/test/YesodCoreTest/StubStrictSameSite.hs b/test/YesodCoreTest/StubStrictSameSite.hs
--- a/test/YesodCoreTest/StubStrictSameSite.hs
+++ b/test/YesodCoreTest/StubStrictSameSite.hs
@@ -1,4 +1,9 @@
-{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.StubStrictSameSite
     ( App ( App )
     , Widget
diff --git a/test/YesodCoreTest/StubUnsecured.hs b/test/YesodCoreTest/StubUnsecured.hs
--- a/test/YesodCoreTest/StubUnsecured.hs
+++ b/test/YesodCoreTest/StubUnsecured.hs
@@ -1,4 +1,9 @@
-{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
 module YesodCoreTest.StubUnsecured
     ( App ( App )
     , Widget
diff --git a/test/YesodCoreTest/SubSub.hs b/test/YesodCoreTest/SubSub.hs
--- a/test/YesodCoreTest/SubSub.hs
+++ b/test/YesodCoreTest/SubSub.hs
@@ -1,9 +1,10 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
 
 module YesodCoreTest.SubSub where
 
diff --git a/test/YesodCoreTest/SubSubData.hs b/test/YesodCoreTest/SubSubData.hs
--- a/test/YesodCoreTest/SubSubData.hs
+++ b/test/YesodCoreTest/SubSubData.hs
@@ -1,5 +1,5 @@
-{-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE TypeFamilies #-}
 
 module YesodCoreTest.SubSubData where
diff --git a/test/YesodCoreTest/WaiSubsite.hs b/test/YesodCoreTest/WaiSubsite.hs
--- a/test/YesodCoreTest/WaiSubsite.hs
+++ b/test/YesodCoreTest/WaiSubsite.hs
@@ -1,4 +1,10 @@
-{-# LANGUAGE CPP, QuasiQuotes, TemplateHaskell, TypeFamilies, MultiParamTypeClasses, OverloadedStrings, ViewPatterns #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
+
 module YesodCoreTest.WaiSubsite
     ( specs
     , Widget
diff --git a/test/YesodCoreTest/Widget.hs b/test/YesodCoreTest/Widget.hs
--- a/test/YesodCoreTest/Widget.hs
+++ b/test/YesodCoreTest/Widget.hs
@@ -1,6 +1,11 @@
-{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE FlexibleInstances, ViewPatterns #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
+
 module YesodCoreTest.Widget
     ( widgetTest
     , resourcesY
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.6.27.0
+version:         1.6.27.1
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -25,7 +25,7 @@
     default-language: Haskell2010
     hs-source-dirs: src
 
-    build-depends:   base                  >= 4.10     && < 5
+    build-depends:   base                  >= 4.11     && < 5
                    , aeson                 >= 1.0
                    , attoparsec-aeson      >= 2.1
                    , auto-update
@@ -50,7 +50,7 @@
                    , parsec                >= 2        && < 3.2
                    , path-pieces           >= 0.1.2    && < 0.3
                    , primitive             >= 0.6
-                   , random                >= 1.0.0.2  && < 1.3
+                   , random                >= 1.0.0.2  && < 1.4
                    , resourcet             >= 1.2
                    , shakespeare           >= 2.0
                    , template-haskell      >= 2.11
@@ -186,7 +186,7 @@
     cpp-options:   -DTEST
     if os(windows)
         cpp-options: -DWINDOWS
-    build-depends:  base < 5
+    build-depends:  base >= 4.11 && < 5
                   , async
                   , bytestring
                   , clientsession
