diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+4.0.4
+-----
+- Compatibility with template-haskell-2.17 and 2.18.
+
 4.0.3
 -----
 - Compatibility with template-haskell-2.16.
diff --git a/cql.cabal b/cql.cabal
--- a/cql.cabal
+++ b/cql.cabal
@@ -1,5 +1,5 @@
 name:                 cql
-version:              4.0.3
+version:              4.0.4
 synopsis:             Cassandra CQL binary protocol.
 stability:            experimental
 license:              OtherLicense
diff --git a/src/Database/CQL/Protocol/Record.hs b/src/Database/CQL/Protocol/Record.hs
--- a/src/Database/CQL/Protocol/Record.hs
+++ b/src/Database/CQL/Protocol/Record.hs
@@ -91,7 +91,11 @@
   where
     go n t = do
         vars <- replicateM (length t) (newName "a")
+#if MIN_VERSION_template_haskell(2,18,0)
+        return $ Clause [ConP n [] (map VarP vars)] (body vars) []
+#else
         return $ Clause [ConP n (map VarP vars)] (body vars) []
+#endif
     body = NormalB . mkTup . map VarE
 
 asRecrdDecl ::Con -> Q Clause
diff --git a/src/Database/CQL/Protocol/Tuple/TH.hs b/src/Database/CQL/Protocol/Tuple/TH.hs
--- a/src/Database/CQL/Protocol/Tuple/TH.hs
+++ b/src/Database/CQL/Protocol/Tuple/TH.hs
@@ -72,7 +72,11 @@
     names <- replicateM n (newName "k")
     return $ Clause [VarP v, TupP (map VarP names)] (NormalB $ body v names) []
   where
+#if MIN_VERSION_template_haskell(2,17,0)
+    body x names = DoE Nothing (NoBindS size : map (NoBindS . value x) names)
+#else
     body x names = DoE (NoBindS size : map (NoBindS . value x) names)
+#endif
     size         = var "put" $$ SigE (litInt n) (tcon "Word16")
     value x v    = var "putValue" $$ VarE x $$ (var "toCql" $$ VarE v)
 
@@ -117,7 +121,11 @@
         Clause
             [VarP (mkName "t")]
             (NormalB $ CaseE (var "t")
+#if MIN_VERSION_template_haskell(2,18,0)
+                [ Match (ParensP (ConP (mkName "CqlTuple") [] [ListP (map VarP names)]))
+#else
                 [ Match (ParensP (ConP (mkName "CqlTuple") [ListP (map VarP names)]))
+#endif
                         (NormalB $ body names)
                         []
                 , Match WildP
