diff --git a/d10.cabal b/d10.cabal
--- a/d10.cabal
+++ b/d10.cabal
@@ -1,5 +1,5 @@
 name: d10
-version: 0.1.0.1
+version: 0.1.1.0
 category: Data
 synopsis: Digits 0-9
 
diff --git a/src/Data/D10/Char.hs b/src/Data/D10/Char.hs
--- a/src/Data/D10/Char.hs
+++ b/src/Data/D10/Char.hs
@@ -1,6 +1,6 @@
-{-# LANGUAGE DeriveLift      #-}
-{-# LANGUAGE InstanceSigs    #-}
-{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveLift       #-}
+{-# LANGUAGE InstanceSigs     #-}
+{-# LANGUAGE TypeApplications #-}
 
 -- | Defines a 'D10' type as a newtype for 'Char', where the
 -- values are restricted to characters between @'0'@ and @'9'@.
@@ -16,6 +16,10 @@
     , d10
     , d10list
 
+    -- * Splice expressions
+    , d10Exp
+    , d10ListExp
+
     -- * Converting between D10 and Char
     , d10Char
     , charD10Maybe
@@ -76,12 +80,13 @@
 import           Prelude                    hiding (fail)
 
 -- template-haskell
-import           Language.Haskell.TH        (ExpQ, Q)
+import           Language.Haskell.TH        (Exp, Q)
 import           Language.Haskell.TH.Quote  (QuasiQuoter (..))
 import           Language.Haskell.TH.Syntax (Lift (lift))
 
 -- $setup
 -- >>> :set -XQuasiQuotes
+-- >>> :set -XTemplateHaskell
 
 ---------------------------------------------------
 
@@ -690,6 +695,46 @@
 
 integralD10Fail :: (Integral a, MonadFail m) => a -> m D10
 integralD10Fail x = integerD10Fail (toInteger x)
+
+---------------------------------------------------
+
+-- | A single base-10 digit.
+--
+-- Produces an expression of type 'D10' that can be used
+-- in a Template Haskell splice.
+--
+-- >>> d10Nat $(d10Exp 5)
+-- 5
+--
+-- >>> d10Nat $(d10Exp 12)
+-- ...
+-- ... d10 must be between 0 and 9
+-- ...
+
+d10Exp :: Integral a => a -> Q Exp
+d10Exp = integralD10Fail >=> lift @D10
+
+-- | A list of base-10 digits.
+--
+-- Produces an expression of type @['D10']@ that can be used
+-- in a Template Haskell splice.
+--
+-- >>> d10Nat <$> $(d10ListExp "")
+-- []
+--
+-- >>> d10Nat <$> $(d10ListExp "5")
+-- [5]
+--
+-- >>> d10Nat <$> $(d10ListExp "58")
+-- [5,8]
+--
+-- >>> d10Nat <$> $(d10ListExp "a")
+-- ...
+-- ... d10 must be between 0 and 9
+-- ...
+
+d10ListExp :: String -> Q Exp
+d10ListExp = strD10ListFail >=> lift @[D10]
 
 ---------------------------------------------------
 
diff --git a/src/Data/D10/Num.hs b/src/Data/D10/Num.hs
--- a/src/Data/D10/Num.hs
+++ b/src/Data/D10/Num.hs
@@ -2,7 +2,6 @@
 {-# LANGUAGE DeriveLift          #-}
 {-# LANGUAGE InstanceSigs        #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE TemplateHaskell     #-}
 {-# LANGUAGE TypeApplications    #-}
 
 -- | Defines a 'D10' type as a newtype for any type with an
@@ -20,6 +19,10 @@
     , d10
     , d10list
 
+    -- * Splice expressions
+    , d10Exp
+    , d10ListExp
+
     -- * Converting between D10 and Char
     , d10Char
     , charD10Maybe
@@ -80,12 +83,13 @@
 import           Prelude                    hiding (fail)
 
 -- template-haskell
-import           Language.Haskell.TH        (ExpQ, Q)
+import           Language.Haskell.TH        (Exp, Q)
 import           Language.Haskell.TH.Quote  (QuasiQuoter (..))
 import           Language.Haskell.TH.Syntax (Lift (lift))
 
 -- $setup
 -- >>> :set -XQuasiQuotes
+-- >>> :set -XTemplateHaskell
 
 ---------------------------------------------------
 
@@ -98,8 +102,13 @@
 -- * @'integerD10Maybe' :: 'Integer' -> 'Maybe' 'D10'@
 -- * @'integerMod10' :: 'Integer' -> 'D10'@
 --
--- With the @QuasiQuotes@ GHC extension enabled, you can write
--- 'D10' literals using the quasi-quoters 'd10' and 'd10list'.
+-- There are also several ways to safely write 'D10' literals
+-- using Template Haskell:
+--
+-- * With the @QuasiQuotes@ GHC extension enabled, you can write
+--   use the quasi-quoters 'd10' and 'd10list'.
+-- * With the @TemplateHaskell@ GHC extension enabled, you can
+--   splice expressions produced by 'd10Exp' and 'd10ListExp'.
 
 newtype D10 a =
     D10_Unsafe a
@@ -693,6 +702,46 @@
 
 integralD10Fail :: (Num b, Integral a, MonadFail m) => a -> m (D10 b)
 integralD10Fail x = integerD10Fail (toInteger x)
+
+---------------------------------------------------
+
+-- | A single base-10 digit.
+--
+-- Produces an expression of type @'D10' a@ that can be used
+-- in a Template Haskell splice.
+--
+-- >>> d10Nat $(d10Exp 5)
+-- 5
+--
+-- >>> d10Nat $(d10Exp 12)
+-- ...
+-- ... d10 must be between 0 and 9
+-- ...
+
+d10Exp :: forall a b. (Integral b, Lift a, Num a) => b -> Q Exp
+d10Exp = integralD10Fail >=> lift @(D10 a)
+
+-- | A list of base-10 digits.
+--
+-- Produces an expression of type @['D10' a]@ that can be used
+-- in a Template Haskell splice.
+--
+-- >>> d10Nat <$> $(d10ListExp "")
+-- []
+--
+-- >>> d10Nat <$> $(d10ListExp "5")
+-- [5]
+--
+-- >>> d10Nat <$> $(d10ListExp "58")
+-- [5,8]
+--
+-- >>> d10Nat <$> $(d10ListExp "a")
+-- ...
+-- ... d10 must be between 0 and 9
+-- ...
+
+d10ListExp :: forall a. (Lift a, Num a) => String -> Q Exp
+d10ListExp = strD10ListFail >=> lift @[D10 a]
 
 ---------------------------------------------------
 
diff --git a/src/Data/D10/Safe.hs b/src/Data/D10/Safe.hs
--- a/src/Data/D10/Safe.hs
+++ b/src/Data/D10/Safe.hs
@@ -1,5 +1,5 @@
-{-# LANGUAGE DeriveLift         #-}
-{-# LANGUAGE TemplateHaskell    #-}
+{-# LANGUAGE DeriveLift       #-}
+{-# LANGUAGE TypeApplications #-}
 
 -- | Defines a 'D10' type as
 -- @'D0' | 'D1' | 'D2' | 'D3' | 'D4' | 'D5' | 'D6' | 'D7' | 'D8' | 'D9'@.
@@ -21,6 +21,10 @@
     , d10
     , d10list
 
+    -- * Splice expressions
+    , d10Exp
+    , d10ListExp
+
     -- * Converting between D10 and Char
     , d10Char
     , charD10Maybe
@@ -80,12 +84,13 @@
 import           Prelude                    hiding (fail)
 
 -- template-haskell
-import           Language.Haskell.TH        (ExpQ, Q)
+import           Language.Haskell.TH        (Exp, Q)
 import           Language.Haskell.TH.Quote  (QuasiQuoter (..))
 import           Language.Haskell.TH.Syntax (Lift (lift))
 
 -- $setup
 -- >>> :set -XQuasiQuotes
+-- >>> :set -XTemplateHaskell
 
 ---------------------------------------------------
 
@@ -727,6 +732,46 @@
     case (integralD10Maybe x) of
         Just y  -> return y
         Nothing -> fail "d10 must be between 0 and 9"
+
+---------------------------------------------------
+
+-- | A single base-10 digit.
+--
+-- Produces an expression of type 'D10' that can be used
+-- in a Template Haskell splice.
+--
+-- >>> $(d10Exp 5)
+-- D5
+--
+-- >>> $(d10Exp 12)
+-- ...
+-- ... d10 must be between 0 and 9
+-- ...
+
+d10Exp :: Integral a => a -> Q Exp
+d10Exp = integralD10Fail >=> lift @D10
+
+-- | A list of base-10 digits.
+--
+-- Produces an expression of type @['D10']@ that can be used
+-- in a Template Haskell splice.
+--
+-- >>> $(d10ListExp "")
+-- []
+--
+-- >>> $(d10ListExp "5")
+-- [D5]
+--
+-- >>> $(d10ListExp "58")
+-- [D5,D8]
+--
+-- >>> $(d10ListExp "a")
+-- ...
+-- ... d10 must be between 0 and 9
+-- ...
+
+d10ListExp :: String -> Q Exp
+d10ListExp = strD10ListFail >=> lift @[D10]
 
 ---------------------------------------------------
 
