diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
 ## Upcoming
 
+## 2.11.20260427
+
+* Support GHC 9.14
+
+## 2.11.20250303
+
+* Support GHC 9.12
+
 ## 2.11.20230408
 
 * Don't expect Control.Monad to be re-exported from mtl anymore
diff --git a/lucid.cabal b/lucid.cabal
--- a/lucid.cabal
+++ b/lucid.cabal
@@ -1,5 +1,5 @@
 name:                lucid
-version:             2.11.20230408
+version:             2.11.20260427
 synopsis:            Clear to write, read and edit DSL for HTML
 description:
   Clear to write, read and edit DSL for HTML.
@@ -33,7 +33,7 @@
                      Lucid.Bootstrap
 
   -- GHC boot libraries
-  build-depends:     base                   >=4.8      && <4.19
+  build-depends:     base                   >=4.8      && <5
                    , bytestring             >=0.10.6.0
                    , containers             >=0.5.6.2
                    , transformers           >=0.4.2.0
diff --git a/src/Lucid/Base.hs b/src/Lucid/Base.hs
--- a/src/Lucid/Base.hs
+++ b/src/Lucid/Base.hs
@@ -4,7 +4,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE GADTs #-}
-{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE TypeOperators #-}
 
 -- Search for UndecidableInstances to see why this is needed
 {-# LANGUAGE UndecidableInstances #-}
@@ -66,7 +66,6 @@
 import qualified Data.Text.Lazy as LT
 import qualified Data.Text.Lazy.Encoding as LT
 import qualified Data.Text.Encoding as T
-import           Data.Typeable (Typeable)
 import           Prelude
 import           Data.Maybe
 import           Data.Sequence (Seq)
@@ -81,7 +80,7 @@
 -- 'makeAttribute'.  Attributes are case sensitive, so if you want
 -- attributes to be merged properly, use a single case representation.
 data Attribute = Attribute !Text !Text
-  deriving (Show,Eq,Typeable)
+  deriving (Show,Eq)
 
 instance Hashable Attribute where
   hashWithSalt salt (Attribute a b) = salt `hashWithSalt` a `hashWithSalt` b
@@ -105,14 +104,6 @@
          -- pass 'mempty' for this argument for a top-level call. See
          -- 'evalHtmlT' and 'execHtmlT' for easier to use functions.
          }
--- GHC 7.4 errors with
---  Can't make a derived instance of `Typeable (HtmlT m a)':
---    `HtmlT' must only have arguments of kind `*'
--- GHC 7.6 errors with
---    `HtmlT' must only have arguments of kind `*'
-#if  __GLASGOW_HASKELL__ >= 707
-  deriving (Typeable)
-#endif
 
 -- | @since 2.9.5
 instance MFunctor HtmlT where
@@ -125,7 +116,9 @@
 -- | Monoid is right-associative, a la the 'Builder' in it.
 instance (a ~ (),Applicative m) => Monoid (HtmlT m a) where
   mempty  = pure mempty
+#if !MIN_VERSION_base(4,11,0)
   mappend = liftA2 mappend
+#endif
 
 -- | Based on the monad instance.
 instance Applicative m => Applicative (HtmlT m) where
@@ -153,20 +146,11 @@
 
 -- | Basically acts like Writer.
 instance Monad m => Monad (HtmlT m) where
-  return a = HtmlT (return (mempty,a))
-  {-# INLINE return #-}
-
   m >>= f = HtmlT $ do
     ~(g,a) <- runHtmlT m
     ~(h,b) <- runHtmlT (f a)
     return (g <> h,b)
   {-# INLINE (>>=) #-}
-
-  m >> n = HtmlT $ do
-    ~(g, _) <- runHtmlT m
-    ~(h, b) <- runHtmlT n
-    return (g <> h, b)
-  {-# INLINE (>>) #-}
 
 -- | Used for 'lift'.
 instance MonadTrans HtmlT where
