diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,10 @@
+# 0.5.3.2
+
+## Dependencies
+
+* Removed explicit dependency on `ghc-prim`, which was not used directly.
+* Updated the upper bound to include `containers-0.8`.
+
 # 0.5.3.1
 
 ## Bug fixes
@@ -18,7 +25,7 @@
 
 # 0.5.2.0
 
-## Addded features
+## Added features
 
  * `IN (SELECT ...)` syntax via `inSelectE`
 
diff --git a/Database/Beam/Haskell/Syntax.hs b/Database/Beam/Haskell/Syntax.hs
--- a/Database/Beam/Haskell/Syntax.hs
+++ b/Database/Beam/Haskell/Syntax.hs
@@ -30,9 +30,6 @@
 import qualified Data.Set as S
 import           Data.String
 import qualified Data.Text as T
-#if !MIN_VERSION_base(4, 11, 0)
-import           Data.Semigroup
-#endif
 
 import qualified Language.Haskell.Exts as Hs
 
diff --git a/Database/Beam/Migrate/Actions.hs b/Database/Beam/Migrate/Actions.hs
--- a/Database/Beam/Migrate/Actions.hs
+++ b/Database/Beam/Migrate/Actions.hs
@@ -112,9 +112,7 @@
 import           Data.Text (Text)
 import qualified Data.Text as T
 import           Data.Typeable
-#if !MIN_VERSION_base(4, 11, 0)
 import           Data.Semigroup
-#endif
 
 import           GHC.Generics
 
@@ -440,7 +438,7 @@
          pure (PotentialAction mempty (HS.fromList ([SomeDatabasePredicate colP] ++ constraintsP))
                                (Seq.singleton (MigrationCommand cmd MigrationKeepsData))
                                ("Add column " <> colNm <> " to " <> qnameAsText tblNm)
-                (addColumnWeight + fromIntegral (T.length (qnameAsText tblNm) + T.length colNm)))
+                (addColumnWeight + (T.length (qnameAsText tblNm) + T.length colNm)))
 
 -- | Action provider for SQL92 @ALTER TABLE ... DROP COLUMN ...@ actions
 dropColumnProvider :: forall be
@@ -469,7 +467,7 @@
          pure (PotentialAction (HS.fromList (SomeDatabasePredicate colP:relatedPreds)) mempty
                                (Seq.singleton (MigrationCommand cmd MigrationLosesData))
                                ("Drop column " <> colNm <> " from " <> qnameAsText tblNm)
-                (dropColumnWeight + fromIntegral (T.length (qnameAsText tblNm) + T.length colNm)))
+                (dropColumnWeight + (T.length (qnameAsText tblNm) + T.length colNm)))
 
 -- | Action provider for SQL92 @ALTER TABLE ... ALTER COLUMN ... SET NULL@
 addColumnNullProvider :: forall be
diff --git a/Database/Beam/Migrate/Backend.hs b/Database/Beam/Migrate/Backend.hs
--- a/Database/Beam/Migrate/Backend.hs
+++ b/Database/Beam/Migrate/Backend.hs
@@ -26,7 +26,7 @@
 --
 -- For an example migrate backend, see "Database.Beam.Sqlite.Migrate"
 module Database.Beam.Migrate.Backend
-  ( BeamMigrationBackend(..)
+  ( BeamMigrationBackend(..), BeamMigrateConnection(..)
   , DdlError
 
   -- * Haskell predicate conversion
@@ -34,6 +34,7 @@
   , sql92HsPredicateConverters
   , hasColumnConverter
   , trivialHsConverter, hsPredicateConverter
+  , withExtraPredicateParsers
 
   -- * For tooling authors
   , SomeBeamMigrationBackend(..), SomeCheckedDatabaseSettings(..) )
@@ -88,8 +89,18 @@
     , backendFileExtension :: String
     , backendConvertToHaskell :: HaskellPredicateConverter
     , backendActionProvider :: ActionProvider be
-    , backendTransact :: forall a. String -> m a -> IO (Either DdlError a)
+    , backendRunSqlScript :: Text -> m ()
+    , backendWithTransaction :: forall a. m a -> m a
+    , backendConnect :: String -> IO (BeamMigrateConnection be m)
     } -> BeamMigrationBackend be m
+
+withExtraPredicateParsers :: BeamMigrationBackend be m -> BeamDeserializers be -> BeamMigrationBackend be m
+withExtraPredicateParsers be ds = be { backendPredicateParsers = backendPredicateParsers be <> ds }
+
+data BeamMigrateConnection be m where
+    BeamMigrateConnection
+        :: { backendRun :: forall a. m a -> IO (Either DdlError a)
+           , backendClose :: IO () } -> BeamMigrateConnection be m
 
 -- | Monomorphic wrapper for use with plugin loaders that cannot handle
 -- polymorphism
diff --git a/Database/Beam/Migrate/Checks.hs b/Database/Beam/Migrate/Checks.hs
--- a/Database/Beam/Migrate/Checks.hs
+++ b/Database/Beam/Migrate/Checks.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE UndecidableInstances #-}
-{-# LANGUAGE CPP #-}
 
 -- | Defines common 'DatabasePredicate's that are shared among backends
 module Database.Beam.Migrate.Checks where
@@ -16,9 +15,6 @@
 import Data.Hashable (Hashable(..))
 import Data.Text (Text)
 import Data.Typeable (Typeable, cast)
-#if !MIN_VERSION_base(4, 11, 0)
-import Data.Semigroup
-#endif
 
 import GHC.Generics (Generic)
 
diff --git a/Database/Beam/Migrate/SQL/Builder.hs b/Database/Beam/Migrate/SQL/Builder.hs
--- a/Database/Beam/Migrate/SQL/Builder.hs
+++ b/Database/Beam/Migrate/SQL/Builder.hs
@@ -13,9 +13,6 @@
 
 import           Data.ByteString.Builder (Builder, byteString, toLazyByteString)
 import qualified Data.ByteString.Lazy.Char8 as BCL
-#if !MIN_VERSION_base(4, 11, 0)
-import           Data.Semigroup
-#endif
 
 
 -- | Options for @CREATE TABLE@. Given as a separate ADT because the options may
diff --git a/Database/Beam/Migrate/SQL/Tables.hs b/Database/Beam/Migrate/SQL/Tables.hs
--- a/Database/Beam/Migrate/SQL/Tables.hs
+++ b/Database/Beam/Migrate/SQL/Tables.hs
@@ -120,8 +120,8 @@
 --               -> 'Migration' be ('CheckedDatabaseSettings' be NewDB)
 -- migrationStep (OldDB oldtable)= do
 --   schema <- 'existingDatabaseSchema' "my_schema"
---   pure $ NewDb <$> pure oldtable
---                <*> 'createTableWithSchema' (Just schema) "my_table"
+--   pure $ NewDB \<$\> pure oldtable
+--                \<*\> 'createTableWithSchema' (Just schema) "my_table"
 -- @
 existingDatabaseSchema :: Text -> Migration be DatabaseSchema
 existingDatabaseSchema = pure . DatabaseSchema
diff --git a/Database/Beam/Migrate/Serialization.hs b/Database/Beam/Migrate/Serialization.hs
--- a/Database/Beam/Migrate/Serialization.hs
+++ b/Database/Beam/Migrate/Serialization.hs
@@ -25,7 +25,8 @@
        , BeamDeserializers(..)
 
        , beamDeserialize, beamDeserializeMaybe
-       , beamDeserializer, sql92Deserializers
+       , beamDeserializer, beamDeserializeJSON
+       , sql92Deserializers
        , sql99DataTypeDeserializers
        , sql2003BinaryAndVarBinaryDataTypeDeserializers
        , sql2008BigIntDataTypeDeserializers
@@ -48,9 +49,6 @@
 import           Data.Text (Text, unpack)
 import           Data.Typeable (Typeable, (:~:)( Refl ), eqT, typeRep, typeOf)
 import qualified Data.Vector as V
-#if !MIN_VERSION_base(4, 11, 0)
-import           Data.Semigroup
-#endif
 
 -- * Serialization helpers
 
@@ -218,6 +216,15 @@
 beamSerializeJSON backend v =
   object [ "be-specific" .= backend
          , "be-data" .= v ]
+
+-- | Corresponding deserializer for 'beamSerializeJSON'
+beamDeserializeJSON :: Text -> (Value -> Parser a) -> Value -> Parser a
+beamDeserializeJSON backend go =
+  withObject "backend-specific item" $ \v -> do
+    be <- v .: "be-specific"
+    guard (be == backend)
+    d <- v .: "be-data"
+    go d
 
 -- | Helper for serializing the precision and decimal count parameters to
 -- 'decimalType', etc.
diff --git a/Database/Beam/Migrate/Types.hs b/Database/Beam/Migrate/Types.hs
--- a/Database/Beam/Migrate/Types.hs
+++ b/Database/Beam/Migrate/Types.hs
@@ -13,7 +13,8 @@
   , CheckedDatabaseEntity(..)
 
   , unCheckDatabase, collectChecks
-  , renameCheckedEntity
+  , unCheckedDbLens
+  , renameCheckedEntity, checkedDbDescriptor
 
     -- ** Modifyinging checked entities
     --
@@ -55,9 +56,6 @@
 import Control.Arrow
 import Control.Category (Category)
 
-#if !MIN_VERSION_base(4, 11, 0)
-import Data.Semigroup
-#endif
 import Data.Text (Text)
 
 -- * Migration types
diff --git a/Database/Beam/Migrate/Types/CheckedEntities.hs b/Database/Beam/Migrate/Types/CheckedEntities.hs
--- a/Database/Beam/Migrate/Types/CheckedEntities.hs
+++ b/Database/Beam/Migrate/Types/CheckedEntities.hs
@@ -63,6 +63,11 @@
                         -> [ SomeDatabasePredicate ]
                         -> CheckedDatabaseEntity be db entityType
 
+checkedDbDescriptor :: Lens' (CheckedDatabaseEntity be db entityType)
+                             (CheckedDatabaseEntityDescriptor be entityType)
+checkedDbDescriptor fn (CheckedDatabaseEntity f ps) =
+    (\f' -> CheckedDatabaseEntity f' ps) <$> fn f
+
 -- | The type of a checked database descriptor. Conceptually, this is just a
 -- 'DatabaseSettings' with a set of predicates. Use 'unCheckDatabase' to get the
 -- regular 'DatabaseSettings' object and 'collectChecks' to access the
@@ -77,6 +82,10 @@
 -- return value is suitable for use in any regular beam query or DML statement.
 unCheckDatabase :: forall be db. Database be db => CheckedDatabaseSettings be db -> DatabaseSettings be db
 unCheckDatabase db = runIdentity $ zipTables (Proxy @be) (\(CheckedDatabaseEntity x _) _ -> pure $ DatabaseEntity (unCheck x)) db db
+
+unCheckedDbLens :: forall be db. Database be db => Lens' (CheckedDatabaseSettings be db) (DatabaseSettings be db)
+unCheckedDbLens f db =
+    (\db' -> runIdentity (zipTables (Proxy @be) (\(CheckedDatabaseEntity d cks) d' -> pure (CheckedDatabaseEntity (d & unChecked .~ (d' ^. dbEntityDescriptor)) cks)) db db')) <$> f (unCheckDatabase db)
 
 -- | A @beam-migrate@ database schema is defined completely by the set of
 -- predicates that apply to it. This function allows you to access this
diff --git a/Database/Beam/Migrate/Types/Predicates.hs b/Database/Beam/Migrate/Types/Predicates.hs
--- a/Database/Beam/Migrate/Types/Predicates.hs
+++ b/Database/Beam/Migrate/Types/Predicates.hs
@@ -14,10 +14,6 @@
 import Data.Hashable
 import Data.Typeable
 
-#if !MIN_VERSION_base(4, 11, 0)
-import           Data.Semigroup
-#endif
-
 import Lens.Micro ((^.))
 
 -- * Predicates
diff --git a/beam-migrate.cabal b/beam-migrate.cabal
--- a/beam-migrate.cabal
+++ b/beam-migrate.cabal
@@ -1,5 +1,5 @@
 name:                beam-migrate
-version:             0.5.3.1
+version:             0.5.3.2
 synopsis:            SQL DDL support and migrations support library for Beam
 description:         This package provides type classes to allow backends to implement
                      SQL DDL support for beam. This allows you to use beam syntax to
@@ -21,7 +21,7 @@
 copyright:           Copyright (C) 2017-2018 Travis Athougies
 category:            Database
 build-type:          Simple
-extra-source-files:  ChangeLog.md
+extra-doc-files:     ChangeLog.md
 cabal-version:       1.18
 
 library
@@ -53,7 +53,7 @@
                        Database.Beam.Migrate.Types.CheckedEntities
                        Database.Beam.Migrate.Types.Predicates
 
-  build-depends:       base                 >=4.9     && <5.0,
+  build-depends:       base                 >=4.11    && <5.0,
                        beam-core            >=0.10    && <0.11,
                        text                 >=1.2     && <2.2,
                        aeson                >=0.11    && <2.3,
@@ -63,13 +63,12 @@
                        mtl                  >=2.2     && <2.4,
                        scientific           >=0.3     && <0.4,
                        vector               >=0.11    && <0.14,
-                       containers           >=0.5     && <0.8,
+                       containers           >=0.5     && <0.9,
                        unordered-containers >=0.2     && <0.3,
-                       hashable             >=1.2     && <1.5,
+                       hashable             >=1.2     && <1.6,
                        microlens            >=0.4     && <0.5,
                        parallel             >=3.2     && <3.3,
                        deepseq              >=1.4     && <1.7,
-                       ghc-prim             >=0.5     && <0.12,
                        haskell-src-exts     >=1.18    && <1.24,
                        pretty               >=1.1     && <1.2,
                        dependent-map        >=0.2     && <0.5,
@@ -82,8 +81,13 @@
                        FlexibleInstances, TypeOperators, TypeApplications, MultiParamTypeClasses,
                        DataKinds, DeriveGeneric
   ghc-options:         -Wall
+                       -Widentities
+                       -Wincomplete-uni-patterns
+                       -Wincomplete-record-updates
   if flag(werror)
     ghc-options:       -Werror
+  if impl(ghc >= 8.10)
+    ghc-options: -Wunused-packages
 
 flag werror
   description: Enable -Werror during development
