diff --git a/esqueleto.cabal b/esqueleto.cabal
--- a/esqueleto.cabal
+++ b/esqueleto.cabal
@@ -1,5 +1,5 @@
 name:                esqueleto
-version:             2.3.0
+version:             2.4.0
 synopsis:            Type-safe EDSL for SQL queries on persistent backends.
 homepage:            https://github.com/prowdsponsor/esqueleto
 license:             BSD3
diff --git a/src/Database/Esqueleto.hs b/src/Database/Esqueleto.hs
--- a/src/Database/Esqueleto.hs
+++ b/src/Database/Esqueleto.hs
@@ -47,7 +47,7 @@
              , random_, round_, ceiling_, floor_
              , min_, max_, sum_, avg_, castNum, castNumM
              , coalesce, coalesceDefault
-             , lower_, like, ilike, (%), concat_, (++.)
+             , lower_, like, ilike, (%), concat_, (++.), castString
              , subList_select, subList_selectDistinct, valList, justList
              , in_, notIn, exists, notExists
              , set, (=.), (+=.), (-=.), (*=.), (/=.)
diff --git a/src/Database/Esqueleto/Internal/Language.hs b/src/Database/Esqueleto/Internal/Language.hs
--- a/src/Database/Esqueleto/Internal/Language.hs
+++ b/src/Database/Esqueleto/Internal/Language.hs
@@ -397,15 +397,15 @@
   coalesceDefault :: PersistField a => [expr (Value (Maybe a))] -> expr (Value a) -> expr (Value a)
 
   -- | @LOWER@ function.
-  lower_ :: (PersistField a, SqlString a) => expr (Value a) -> expr (Value a)
+  lower_ :: SqlString s => expr (Value s) -> expr (Value s)
   -- | @LIKE@ operator.
-  like :: (PersistField s, SqlString s) => expr (Value s) -> expr (Value s) -> expr (Value Bool)
+  like :: SqlString s => expr (Value s) -> expr (Value s) -> expr (Value Bool)
   -- | @ILIKE@ operator (case-insensitive @LIKE@).
   --
   -- Supported by PostgreSQL only.
   --
   -- /Since: 2.2.3/
-  ilike :: (PersistField s, SqlString s) => expr (Value s) -> expr (Value s) -> expr (Value Bool)
+  ilike :: SqlString s => expr (Value s) -> expr (Value s) -> expr (Value Bool)
   -- | The string @'%'@.  May be useful while using 'like' and
   -- concatenation ('concat_' or '++.', depending on your
   -- database).  Note that you always to type the parenthesis,
@@ -414,14 +414,25 @@
   -- @
   -- name `'like`` (%) ++. 'val' \"John\" ++. (%)
   -- @
-  (%) :: (PersistField s, SqlString s) => expr (Value s)
+  (%) :: SqlString s => expr (Value s)
   -- | The @CONCAT@ function with a variable number of
   -- parameters.  Supported by MySQL and PostgreSQL.
-  concat_ :: (PersistField s, SqlString s) => [expr (Value s)] -> expr (Value s)
+  concat_ :: SqlString s => [expr (Value s)] -> expr (Value s)
   -- | The @||@ string concatenation operator (named after
   -- Haskell's '++' in order to avoid naming clash with '||.').
   -- Supported by SQLite and PostgreSQL.
-  (++.) :: (PersistField s, SqlString s) => expr (Value s) -> expr (Value s) -> expr (Value s)
+  (++.) :: SqlString s => expr (Value s) -> expr (Value s) -> expr (Value s)
+  -- | Cast a string type into 'Text'.  This function
+  -- is very useful if you want to use @newtype@s, or if you want
+  -- to apply functions such as 'like' to strings of different
+  -- types.
+  --
+  -- /Safety:/ This is a slightly unsafe function, especially if
+  -- you have defined your own instances of 'SqlString'.  Also,
+  -- since 'Maybe' is an instance of 'SqlString', it's possible
+  -- to turn a nullable value into a non-nullable one.  Avoid
+  -- using this function if possible.
+  castString :: (SqlString s, SqlString r) => expr (Value s) -> expr (Value r)
 
   -- | Execute a subquery @SELECT@ in an expression.  Returns a
   -- list of values.
@@ -782,8 +793,8 @@
 -- If you have a custom data type or @newtype@, feel free to make
 -- it an instance of this class.
 --
--- /Since: 2.3.0/
-class SqlString a where
+-- /Since: 2.4.0/
+class PersistField a => SqlString a where
 
 -- | /Since: 2.3.0/
 instance (a ~ Char) => SqlString [a] where
@@ -798,11 +809,10 @@
 instance SqlString B.ByteString where
 
 -- | /Since: 2.3.0/
-instance SqlString BL.ByteString where
-
--- | /Since: 2.3.0/
 instance SqlString Html where
 
+-- | /Since: 2.4.0/
+instance SqlString a => SqlString (Maybe a) where
 
 
 -- | @FROM@ clause: bring entities into scope.
diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs
--- a/src/Database/Esqueleto/Internal/Sql.hs
+++ b/src/Database/Esqueleto/Internal/Sql.hs
@@ -488,6 +488,7 @@
   (%)     = unsafeSqlValue    "'%'"
   concat_ = unsafeSqlFunction "CONCAT"
   (++.)   = unsafeSqlBinOp    " || "
+  castString = veryUnsafeCoerceSqlExprValue
 
   subList_select         = EList . sub_select
   subList_selectDistinct = subList_select . distinct
