diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -1,13 +1,13 @@
 Numerals
 ========
 
-Convert numbers to numerals (number words) in a number of
-languages. Each language has its own module. The module name is based
-on one of the ISO 639 Alpha codes. Each module contains one or more
-functions to convert numerical values to numerals. Several types of
-numerals are supported. But not every type is supported by every
-language. Some because they do not occur in that language. Others
-because they are not yet defined in this package.
+Convert numbers to number words in a number of languages. Each
+language has its own module. The module name is based on the ISO 639-3
+code for that language. Each module contains one or more functions to
+convert numerical values to numerals. Several types of numerals are
+supported. But not every type is supported by every language. Some
+because they do not occur in that language. Others because they are
+not yet defined in this package.
 
 - Cardinal numerals
 
diff --git a/numerals.cabal b/numerals.cabal
--- a/numerals.cabal
+++ b/numerals.cabal
@@ -1,6 +1,6 @@
 name:          numerals
-version:       0.4
-cabal-version: >= 1.8
+version:       0.4.1
+cabal-version: >= 1.9.2
 build-type:    Simple
 stability:     experimental
 author:        Roel van Dijk <vandijk.roel@gmail.com>, Bas van Dijk <v.dijk.bas@gmail.com>
@@ -13,75 +13,16 @@
 category:      Natural Language Processing, Numerical, Text
 synopsis:      Convert numbers to number words
 description:
-  Convert numbers to number words in a number of languages. Each
-  language has its own module. The module name is based on one of the
-  ISO 639 Alpha codes. Each module contains one or more 'cardinal' and
-  'ordinal' functions and a 'struct' function. The 'cardinal'
-  functions directly convert cardinal numbers to a string-like
-  representation of their spoken form. The 'ordinal' functions do the
-  same but for ordinal numbers. The 'struct' functions convert numbers
-  to a polymorphic representation of their grammatical structure.
-  .
-  The use of this package is best understood with some examples. First
-  some English number names, both British and US variants:
-  .
-  >>> import qualified Text.Numeral.Language.EN as EN
-  >>> EN.uk_cardinal defaultInflection 123 :: Maybe Text
-  Just "one hundred and twenty-three"
-  >>> EN.us_cardinal defaultInflection (10^50 + 42) :: Maybe Text
-  Just "one hundred quindecillion forty-two"
-  .
-  French, which contains some traces of a base 20 system:
-  .
-  >>> import qualified Text.Numeral.Language.FR as FR
-  >>> FR.cardinal defaultInflection (-99) :: Maybe Text
-  Just "moins quatre-vingt-dix-neuf"
-  .
-  Conversions can fail. Alamblak, a language spoken by a few people in
-  Papua New Guinea, has no representation for negative numbers:
-  .
-  >>> import qualified Text.Numeral.Language.AMP as AMP
-  >>> AMP.cardinal defaultInflection (-3) :: Maybe Text
-  Nothing
-  .
-  Some languages have multiple scripts and methods for writing number
-  names. Take Chinese for example, which can be written using Han
-  characters or transcribed to the Latin script using Pinyin.
-  .
-  Traditional Chinese characters:
-  .
-  >>> import qualified Text.Numeral.Language.ZH as ZH
-  >>> ZH.trad_cardinal defaultInflection 123456 :: Maybe Text
-  Just "十二萬三千四百五十六"
-  .
-  Simplified characters for use in financial contexts:
-  .
-  >>> ZH.finance_simpl_cardinal defaultInflection 123456 :: Maybe Text
-  Just "拾贰万参仟肆伯伍拾陆"
-  .
-  Transcribed using Pinyin:
-  .
-  >>> ZH.pinyin_cardinal defaultInflection 123456 :: Maybe Text
-  Just "shíèrwàn sānqiān sìbǎi wǔshí liù"
-  .
-  Using the 'struct' functions you can see the grammatical structure
-  of number names. Because the results of these functions are
-  polymorphic you need to specify a specific type.
-  .
-  >>> import qualified Text.Numeral.Language.NL as NL
-  >>> NL.struct 123 :: Integer
-  123
-  >>> import Text.Numeral
-  >>> NL.struct 123 :: Exp
-  Add (Lit 100) (Add (Lit 3) (Mul (Lit 2) (Lit 10)))
-  .
-  Compare with:
-  .
-  >>> NL.cardinal defaultInflection 123 :: Maybe Text
-  Just "honderddrieëntwintig"
-  .
-  100 (honderd) + (3 (drie) + (ën) 2 (twin) * 10 (tig))
+  Convert numbers to number words in a number of languages. Each language has
+  its own module. The module name is based on the ISO 639-3 code for that
+  language. Each module contains one or more 'cardinal' and 'ordinal' functions
+  and a 'struct' function. The 'cardinal' functions directly convert cardinal
+  numbers to a string-like representation of their spoken form. The 'ordinal'
+  functions do the same but for ordinal numbers. The 'struct' functions convert
+  numbers to a polymorphic representation of their grammatical structure.
 
+  See the "Text.Numeral" module for information on how to use this library.
+
 extra-source-files: ./README.markdown
 
 -------------------------------------------------------------------------------
@@ -92,72 +33,88 @@
 
 -------------------------------------------------------------------------------
 
+flag integer-simple
+  description: Use the integer-simple package instead of integer-gmp
+  default:     False
+
+-------------------------------------------------------------------------------
+
 library
   hs-source-dirs: src
   ghc-options: -Wall
 
-  build-depends: base                       >= 3.0.3.1 && < 4.7
-               , base-unicode-symbols       >= 0.2.2   && < 0.3
-               , containers                 >= 0.4     && < 0.6
-               , containers-unicode-symbols >= 0.3     && < 0.4
-               , fingertree                 >= 0.0.1   && < 0.2
-               , text                       >= 0.11    && < 1.2
+  build-depends: base       >= 3.0.3.1 && < 5
+               , containers >= 0.4     && < 0.6
+               , fingertree >= 0.0.1   && < 0.2
+               , text       >= 0.11    && < 1.3
 
-  if impl(ghc >= 7.2.1)
-    build-depends: integer-gmp >= 0.3 && < 0.6
+  -- if impl(ghc >= 7.2.1)
+  --   build-depends: integer-gmp >= 0.3 && < 1.1
 
+  if flag(integer-simple)
+      build-depends: integer-simple
+      CPP-options: -DINTEGER_SIMPLE
+  else
+      build-depends: integer-gmp
+
   exposed-modules: Text.Numeral
                  , Text.Numeral.BigNum
                  , Text.Numeral.Entry
                  , Text.Numeral.Exp
-                 , Text.Numeral.Exp.Reified
                  , Text.Numeral.Grammar
-                 , Text.Numeral.Grammar.Reified
                  , Text.Numeral.Misc
                  , Text.Numeral.Render
                  , Text.Numeral.Rules
 
                  , Text.Numeral.Language.Entries
-                 , Text.Numeral.Language.AF
+                 , Text.Numeral.Language.AFR
                  , Text.Numeral.Language.AMP
-                 , Text.Numeral.Language.BG
+                 , Text.Numeral.Language.BUL
+                 , Text.Numeral.Language.CES
                  , Text.Numeral.Language.CHN
                  , Text.Numeral.Language.CHR
                  , Text.Numeral.Language.CLM
-                 , Text.Numeral.Language.CS
-                 , Text.Numeral.Language.DE
-                 , Text.Numeral.Language.EN
-                 , Text.Numeral.Language.EO
-                 , Text.Numeral.Language.ES
-                 , Text.Numeral.Language.FI
-                 , Text.Numeral.Language.FR
+                 , Text.Numeral.Language.CRO
+                 , Text.Numeral.Language.DEU
+                 , Text.Numeral.Language.ENG
+                 , Text.Numeral.Language.EPO
+                 , Text.Numeral.Language.FIN
+                 , Text.Numeral.Language.FRA
                  , Text.Numeral.Language.FUR
+                 , Text.Numeral.Language.GLV
                  , Text.Numeral.Language.GSW
-                 , Text.Numeral.Language.GV
-                 , Text.Numeral.Language.HE
+                 , Text.Numeral.Language.HEB
                  , Text.Numeral.Language.HOP
-                 , Text.Numeral.Language.IT
-                 , Text.Numeral.Language.JA
-                 , Text.Numeral.Language.LA
+                 , Text.Numeral.Language.ITA
+                 , Text.Numeral.Language.JPN
+                 , Text.Numeral.Language.LAT
                  , Text.Numeral.Language.LLD
-                 , Text.Numeral.Language.MG
-                 , Text.Numeral.Language.NL
-                 , Text.Numeral.Language.NO
+                 , Text.Numeral.Language.MLG
+                 , Text.Numeral.Language.NEN
+                 , Text.Numeral.Language.NLD
+                 , Text.Numeral.Language.NOB
                  , Text.Numeral.Language.NQM
-                 , Text.Numeral.Language.OJ
+                 , Text.Numeral.Language.OJI
                  , Text.Numeral.Language.PDC
-                 , Text.Numeral.Language.PL
-                 , Text.Numeral.Language.PT
-                 , Text.Numeral.Language.RU
+                 , Text.Numeral.Language.POL
+                 , Text.Numeral.Language.POR
+                 , Text.Numeral.Language.RUS
                  , Text.Numeral.Language.SCO
-                 , Text.Numeral.Language.SV
-                 , Text.Numeral.Language.TR
-                 , Text.Numeral.Language.WO
+                 , Text.Numeral.Language.SPA
+                 , Text.Numeral.Language.SWE
+                 , Text.Numeral.Language.TUR
+                 , Text.Numeral.Language.WOL
                  , Text.Numeral.Language.YOR
-                 , Text.Numeral.Language.ZH
-  other-modules: Text.Numeral.Render.Utils
+                 , Text.Numeral.Language.ZHO
+  other-modules: Math.NumberTheory.Logarithms
+               , GHC.Integer.Logarithms.Compat
+               , Text.Numeral.Render.Utils
 
+  extensions: ScopedTypeVariables
+            , PackageImports
+            , OverloadedStrings
 
+
 -------------------------------------------------------------------------------
 
 test-suite test-numerals
@@ -169,85 +126,136 @@
 
                , Text.Numeral.Language.ACH.TestData
                , Text.Numeral.Language.ADY.TestData
-               , Text.Numeral.Language.AF.TestData
+               , Text.Numeral.Language.AFR.TestData
                , Text.Numeral.Language.AMP.TestData
                , Text.Numeral.Language.ARI.TestData
+               , Text.Numeral.Language.ARN.TestData
                , Text.Numeral.Language.AST.TestData
-               , Text.Numeral.Language.AZ.TestData
-               , Text.Numeral.Language.BA.TestData
-               , Text.Numeral.Language.BG.TestData
-               , Text.Numeral.Language.BM.TestData
-               , Text.Numeral.Language.CA.TestData
+               , Text.Numeral.Language.AZE.TestData
+               , Text.Numeral.Language.BAK.TestData
+               , Text.Numeral.Language.BAM.TestData
+               , Text.Numeral.Language.BUL.TestData
                , Text.Numeral.Language.CAF.TestData
+               , Text.Numeral.Language.CAR.TestData
+               , Text.Numeral.Language.CAT.TestData
                , Text.Numeral.Language.CBK.TestData
+               , Text.Numeral.Language.CES.TestData
                , Text.Numeral.Language.CHN.TestData
                , Text.Numeral.Language.CHR.TestData
+               , Text.Numeral.Language.CKU.TestData
                , Text.Numeral.Language.CLM.TestData
-               , Text.Numeral.Language.CO.TestData
+               , Text.Numeral.Language.CRO.TestData
                , Text.Numeral.Language.COD.TestData
                , Text.Numeral.Language.COO.TestData
-               , Text.Numeral.Language.CS.TestData
-               , Text.Numeral.Language.CY.TestData
-               , Text.Numeral.Language.DE.TestData
+               , Text.Numeral.Language.COS.TestData
+               , Text.Numeral.Language.CRG.TestData
+               , Text.Numeral.Language.CYM.TestData
+               , Text.Numeral.Language.DEU.TestData
                , Text.Numeral.Language.DJK.TestData
-               , Text.Numeral.Language.EN.TestData
-               , Text.Numeral.Language.EO.TestData
-               , Text.Numeral.Language.ES.TestData
-               , Text.Numeral.Language.ET.TestData
-               , Text.Numeral.Language.FI.TestData
-               , Text.Numeral.Language.FO.TestData
-               , Text.Numeral.Language.FR.TestData
+               , Text.Numeral.Language.EKK.TestData
+               , Text.Numeral.Language.EMI.TestData
+               , Text.Numeral.Language.ENG.TestData
+               , Text.Numeral.Language.EPO.TestData
+               , Text.Numeral.Language.FAO.TestData
+               , Text.Numeral.Language.FIN.TestData
+               , Text.Numeral.Language.FRA.TestData
+               , Text.Numeral.Language.FRA_JER.TestData
+               , Text.Numeral.Language.FRR.TestData
                , Text.Numeral.Language.FUR.TestData
                , Text.Numeral.Language.GCF_MTQ.TestData
                , Text.Numeral.Language.GIL.TestData
-               , Text.Numeral.Language.GL.TestData
+               , Text.Numeral.Language.GLG.TestData
+               , Text.Numeral.Language.GLV.TestData
                , Text.Numeral.Language.GSW.TestData
-               , Text.Numeral.Language.GV.TestData
                , Text.Numeral.Language.HAI.TestData
-               , Text.Numeral.Language.HE.TestData
+               , Text.Numeral.Language.HAT.TestData
+               , Text.Numeral.Language.HEB.TestData
                , Text.Numeral.Language.HOP.TestData
-               , Text.Numeral.Language.HR.TestData
-               , Text.Numeral.Language.HU.TestData
-               , Text.Numeral.Language.HY.TestData
-               , Text.Numeral.Language.IT.TestData
-               , Text.Numeral.Language.JA.TestData
+               , Text.Numeral.Language.HRV.TestData
+               , Text.Numeral.Language.HUN.TestData
+               , Text.Numeral.Language.HUP.TestData
+               , Text.Numeral.Language.HUR.TestData
+               , Text.Numeral.Language.HYE.TestData
+               , Text.Numeral.Language.IBO.TestData
+               , Text.Numeral.Language.IND.TestData
+               , Text.Numeral.Language.INH.TestData
+               , Text.Numeral.Language.ITA.TestData
+               , Text.Numeral.Language.IZH.TestData
+               , Text.Numeral.Language.JPN.TestData
                , Text.Numeral.Language.KAP.TestData
                , Text.Numeral.Language.KEA.TestData
-               , Text.Numeral.Language.LA.TestData
+               , Text.Numeral.Language.KLB.TestData
+               , Text.Numeral.Language.KMR.TestData
+               , Text.Numeral.Language.KRL.TestData
+               , Text.Numeral.Language.LAT.TestData
+               , Text.Numeral.Language.LAV.TestData
+               , Text.Numeral.Language.LIN.TestData
+               , Text.Numeral.Language.LIT.TestData
+               , Text.Numeral.Language.LIV.TestData
                , Text.Numeral.Language.LLD.TestData
-               , Text.Numeral.Language.MG.TestData
+               , Text.Numeral.Language.LMO.TestData
+               , Text.Numeral.Language.LTZ.TestData
+               , Text.Numeral.Language.MIC.TestData
+               , Text.Numeral.Language.MIN.TestData
+               , Text.Numeral.Language.MLG.TestData
+               , Text.Numeral.Language.MNK.TestData
                , Text.Numeral.Language.MOH.TestData
-               , Text.Numeral.Language.NL.TestData
-               , Text.Numeral.Language.NO.TestData
+               , Text.Numeral.Language.NAV.TestData
+               , Text.Numeral.Language.NEE.TestData
+               , Text.Numeral.Language.NEN.TestData
+               , Text.Numeral.Language.NLD.TestData
+               , Text.Numeral.Language.NOB.TestData
                , Text.Numeral.Language.NQM.TestData
-               , Text.Numeral.Language.OJ.TestData
+               , Text.Numeral.Language.OCI.TestData
+               , Text.Numeral.Language.OJI.TestData
+               , Text.Numeral.Language.ONE.TestData
+               , Text.Numeral.Language.ORM.TestData
                , Text.Numeral.Language.PAA.TestData
                , Text.Numeral.Language.PDC.TestData
-               , Text.Numeral.Language.PL.TestData
-               , Text.Numeral.Language.PT.TestData
+               , Text.Numeral.Language.POL.TestData
+               , Text.Numeral.Language.POR.TestData
                , Text.Numeral.Language.RMN_DZA.TestData
-               , Text.Numeral.Language.RO.TestData
-               , Text.Numeral.Language.RU.TestData
+               , Text.Numeral.Language.RMY_KAL.TestData
+               , Text.Numeral.Language.RON.TestData
+               , Text.Numeral.Language.RUS.TestData
                , Text.Numeral.Language.SCO.TestData
-               , Text.Numeral.Language.SV.TestData
+               , Text.Numeral.Language.SME.TestData
+               , Text.Numeral.Language.SMN.TestData
+               , Text.Numeral.Language.SPA.TestData
+               , Text.Numeral.Language.SWE.TestData
                , Text.Numeral.Language.TAR.TestData
-               , Text.Numeral.Language.TR.TestData
-               , Text.Numeral.Language.WO.TestData
+               , Text.Numeral.Language.TGS.TestData
+               , Text.Numeral.Language.TUR.TestData
+               , Text.Numeral.Language.WMW.TestData
+               , Text.Numeral.Language.WOL.TestData
+               , Text.Numeral.Language.XPQ.TestData
                , Text.Numeral.Language.YOR.TestData
+               , Text.Numeral.Language.ZAI.TestData
                , Text.Numeral.Language.ZAQ.TestData
-               , Text.Numeral.Language.ZH.TestData
+               , Text.Numeral.Language.ZHO.TestData
                , Text.Numeral.Language.ZPC.TestData
+               , Text.Numeral.Language.ZPL.TestData
   ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
-
-  build-depends: base                       >= 3.0.3.1 && < 4.7
-               , base-unicode-symbols       >= 0.2.2   && < 0.3
-               , HUnit                      >= 1.2.2   && < 1.3
-               , QuickCheck                 >= 2.4.2   && < 2.7
-               , test-framework             >= 0.3.3   && < 0.9
-               , test-framework-hunit       >= 0.2.6   && < 0.4
-               , test-framework-quickcheck2 >= 0.2.12  && < 0.4
-               , text                       >= 0.11    && < 1.2
+  extensions: PackageImports
+            , OverloadedStrings
+            , ScopedTypeVariables
+  build-depends: base                       >= 4   && < 5
+               , HUnit                      >= 1.3 && < 1.4
+               , QuickCheck                 >= 2.8 && < 2.9
+               , test-framework             >= 0.8 && < 0.9
+               , test-framework-hunit       >= 0.3 && < 0.4
+               , test-framework-quickcheck2 >= 0.3 && < 0.4
+               , text                       >= 1.2 && < 1.3
                , numerals
 
-  if impl(ghc >= 7.2.1)
-    build-depends: integer-gmp >= 0.3 && < 0.6
+-------------------------------------------------------------------------------
+
+benchmark bench-numerals
+  type: exitcode-stdio-1.0
+  main-is: bench.hs
+  hs-source-dirs: src-bench
+
+  build-depends: base      >= 3.0.3.1 && < 5
+               , criterion >= 0.8     && < 1.2
+               , numerals
+  extensions: PackageImports
diff --git a/src-bench/bench.hs b/src-bench/bench.hs
new file mode 100644
--- /dev/null
+++ b/src-bench/bench.hs
@@ -0,0 +1,10 @@
+module Main where
+
+import "criterion" Criterion.Main
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import qualified "numerals" Text.Numeral.Language.NLD as NLD
+
+
+main :: IO ()
+main = defaultMain
+       [bench "NLD" $ NLD.cardinal defaultInflection `nf` (10 ^ (42 :: Integer) - 1 :: Integer)]
diff --git a/src-test/Text/Numeral/Language/ACH/TestData.hs b/src-test/Text/Numeral/Language/ACH/TestData.hs
--- a/src-test/Text/Numeral/Language/ACH/TestData.hs
+++ b/src-test/Text/Numeral/Language/ACH/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-acholi/en/ach/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/ADY/TestData.hs b/src-test/Text/Numeral/Language/ADY/TestData.hs
--- a/src-test/Text/Numeral/Language/ADY/TestData.hs
+++ b/src-test/Text/Numeral/Language/ADY/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-adyghe/en/ady/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/AF/TestData.hs b/src-test/Text/Numeral/Language/AF/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/AF/TestData.hs
+++ /dev/null
@@ -1,129 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        af
-
-[@ISO639-2@]        afr
-
-[@ISO639-3@]        afr
-
-[@Native name@]     Afrikaans
-
-[@English name@]    Afrikaans
--}
-
-module Text.Numeral.Language.AF.TestData (cardinals, ordinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude       ( Integral )
-import "numerals" Text.Numeral.Misc ( dec )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-afrikaans/en/afr/
-  http://mylanguages.org/afrikaans_numbers.php
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "nul")
-      , (1, "een")
-      , (2, "twee")
-      , (3, "drie")
-      , (4, "vier")
-      , (5, "vyf")
-      , (6, "ses")
-      , (7, "sewe")
-      , (8, "ag")
-      , (9, "nege")
-      , (10, "tien")
-      , (11, "elf")
-      , (12, "twaalf")
-      , (13, "dertien")
-      , (14, "veertien")
-      , (15, "vyftien")
-      , (16, "sestien")
-      , (17, "sewentien")
-      , (18, "agtien")
-      , (19, "negentien")
-      , (20, "twintig")
-      , (21, "een-en-twintig")
-      , (22, "twee-en-twintig")
-      , (23, "drie-en-twintig")
-      , (24, "vier-en-twintig")
-      , (25, "vyf-en-twintig")
-      , (26, "ses-en-twintig")
-      , (27, "sewe-en-twintig")
-      , (28, "ag-en-twintig")
-      , (29, "nege-en-twintig")
-      , (30, "dertig")
-      , (31, "een-en-dertig")
-      , (32, "twee-en-dertig")
-      , (33, "drie-en-dertig")
-      , (34, "vier-en-dertig")
-      , (35, "vyf-en-dertig")
-      , (36, "ses-en-dertig")
-      , (37, "sewe-en-dertig")
-      , (38, "ag-en-dertig")
-      , (39, "nege-en-dertig")
-      , (40, "veertig")
-      , (50, "vyftig")
-      , (60, "sestig")
-      , (70, "sewentig")
-      , (80, "tagtig")
-      , (90, "neëntig")
-      , (100, "eenhonderd")
-      , (121, "eenhonderd een-en-twintig")
-      , (1000, "eenduisend")
-      , (1219, "eenduisend tweehonderd negentien")
-      , (dec 6, "een miljoen")
-      , (dec 9, "een miljard")
-      , (dec 12, "een biljoen")
-      ]
-    )
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "eerste")
-      , (2, "tweede")
-      , (3, "derde")
-      , (4, "vierde")
-      , (5, "vyfde")
-      , (6, "sesde")
-      , (7, "sewende")
-      , (8, "agtste")
-      , (9, "negende")
-      , (10, "tiende")
-      , (11, "elfde")
-      , (12, "twaalfde")
-      , (13, "dertiende")
-      , (14, "veertiende")
-      , (15, "vyftiende")
-      , (16, "sestiende")
-      , (17, "sewentiende")
-      , (18, "agtiende")
-      , (19, "negentiende")
-      , (20, "twintigste")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/AFR/TestData.hs b/src-test/Text/Numeral/Language/AFR/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/AFR/TestData.hs
@@ -0,0 +1,122 @@
+{-|
+[@ISO639-1@]        af
+
+[@ISO639-2@]        afr
+
+[@ISO639-3@]        afr
+
+[@Native name@]     Afrikaans
+
+[@English name@]    Afrikaans
+-}
+
+module Text.Numeral.Language.AFR.TestData (cardinals, ordinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Misc ( dec )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-afrikaans/en/afr/
+  http://mylanguages.org/afrikaans_numbers.php
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "nul")
+      , (1, "een")
+      , (2, "twee")
+      , (3, "drie")
+      , (4, "vier")
+      , (5, "vyf")
+      , (6, "ses")
+      , (7, "sewe")
+      , (8, "ag")
+      , (9, "nege")
+      , (10, "tien")
+      , (11, "elf")
+      , (12, "twaalf")
+      , (13, "dertien")
+      , (14, "veertien")
+      , (15, "vyftien")
+      , (16, "sestien")
+      , (17, "sewentien")
+      , (18, "agtien")
+      , (19, "negentien")
+      , (20, "twintig")
+      , (21, "een-en-twintig")
+      , (22, "twee-en-twintig")
+      , (23, "drie-en-twintig")
+      , (24, "vier-en-twintig")
+      , (25, "vyf-en-twintig")
+      , (26, "ses-en-twintig")
+      , (27, "sewe-en-twintig")
+      , (28, "ag-en-twintig")
+      , (29, "nege-en-twintig")
+      , (30, "dertig")
+      , (31, "een-en-dertig")
+      , (32, "twee-en-dertig")
+      , (33, "drie-en-dertig")
+      , (34, "vier-en-dertig")
+      , (35, "vyf-en-dertig")
+      , (36, "ses-en-dertig")
+      , (37, "sewe-en-dertig")
+      , (38, "ag-en-dertig")
+      , (39, "nege-en-dertig")
+      , (40, "veertig")
+      , (50, "vyftig")
+      , (60, "sestig")
+      , (70, "sewentig")
+      , (80, "tagtig")
+      , (90, "neëntig")
+      , (100, "eenhonderd")
+      , (121, "eenhonderd een-en-twintig")
+      , (1000, "eenduisend")
+      , (1219, "eenduisend tweehonderd negentien")
+      , (dec 6, "een miljoen")
+      , (dec 9, "een miljard")
+      , (dec 12, "een biljoen")
+      ]
+    )
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "eerste")
+      , (2, "tweede")
+      , (3, "derde")
+      , (4, "vierde")
+      , (5, "vyfde")
+      , (6, "sesde")
+      , (7, "sewende")
+      , (8, "agtste")
+      , (9, "negende")
+      , (10, "tiende")
+      , (11, "elfde")
+      , (12, "twaalfde")
+      , (13, "dertiende")
+      , (14, "veertiende")
+      , (15, "vyftiende")
+      , (16, "sestiende")
+      , (17, "sewentiende")
+      , (18, "agtiende")
+      , (19, "negentiende")
+      , (20, "twintigste")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/AMP/TestData.hs b/src-test/Text/Numeral/Language/AMP/TestData.hs
--- a/src-test/Text/Numeral/Language/AMP/TestData.hs
+++ b/src-test/Text/Numeral/Language/AMP/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -22,8 +17,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -36,7 +30,7 @@
   http://www.sf.airnet.ne.jp/~ts/language/number/alamblak.html
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/ARI/TestData.hs b/src-test/Text/Numeral/Language/ARI/TestData.hs
--- a/src-test/Text/Numeral/Language/ARI/TestData.hs
+++ b/src-test/Text/Numeral/Language/ARI/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-arikara/en/ari/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/ARN/TestData.hs b/src-test/Text/Numeral/Language/ARN/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/ARN/TestData.hs
@@ -0,0 +1,175 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        arn
+
+[@Native name@]     Mapudungun
+
+[@English name@]    Mapuche
+-}
+module Text.Numeral.Language.ARN.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-mapudungun/en/arn/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "sero")
+      , (1, "kiñe")
+      , (2, "epu")
+      , (3, "küla")
+      , (4, "meli")
+      , (5, "kechu")
+      , (6, "kayu")
+      , (7, "reqle")
+      , (8, "pura")
+      , (9, "aylla")
+      , (10, "mari")
+      , (11, "mari kiñe")
+      , (12, "mari epu")
+      , (13, "mari küla")
+      , (14, "mari meli")
+      , (15, "mari kechu")
+      , (16, "mari kayu")
+      , (17, "mari reqle")
+      , (18, "mari pura")
+      , (19, "mari aylla")
+      , (20, "epu mari")
+      , (21, "epu mari kiñe")
+      , (22, "epu mari epu")
+      , (23, "epu mari küla")
+      , (24, "epu mari meli")
+      , (25, "epu mari kechu")
+      , (26, "epu mari kayu")
+      , (27, "epu mari reqle")
+      , (28, "epu mari pura")
+      , (29, "epu mari aylla")
+      , (30, "küla mari")
+      , (31, "küla mari kiñe")
+      , (32, "küla mari epu")
+      , (33, "küla mari küla")
+      , (34, "küla mari meli")
+      , (35, "küla mari kechu")
+      , (36, "küla mari kayu")
+      , (37, "küla mari reqle")
+      , (38, "küla mari pura")
+      , (39, "küla mari aylla")
+      , (40, "meli mari")
+      , (41, "meli mari kiñe")
+      , (42, "meli mari epu")
+      , (43, "meli mari küla")
+      , (44, "meli mari meli")
+      , (45, "meli mari kechu")
+      , (46, "meli mari kayu")
+      , (47, "meli mari reqle")
+      , (48, "meli mari pura")
+      , (49, "meli mari aylla")
+      , (50, "kechu mari")
+      , (51, "kechu mari kiñe")
+      , (52, "kechu mari epu")
+      , (53, "kechu mari küla")
+      , (54, "kechu mari meli")
+      , (55, "kechu mari kechu")
+      , (56, "kechu mari kayu")
+      , (57, "kechu mari reqle")
+      , (58, "kechu mari pura")
+      , (59, "kechu mari aylla")
+      , (60, "kayu mari")
+      , (61, "kayu mari kiñe")
+      , (62, "kayu mari epu")
+      , (63, "kayu mari küla")
+      , (64, "kayu mari meli")
+      , (65, "kayu mari kechu")
+      , (66, "kayu mari kayu")
+      , (67, "kayu mari reqle")
+      , (68, "kayu mari pura")
+      , (69, "kayu mari aylla")
+      , (70, "reqle mari")
+      , (71, "reqle mari kiñe")
+      , (72, "reqle mari epu")
+      , (73, "reqle mari küla")
+      , (74, "reqle mari meli")
+      , (75, "reqle mari kechu")
+      , (76, "reqle mari kayu")
+      , (77, "reqle mari reqle")
+      , (78, "reqle mari pura")
+      , (79, "reqle mari aylla")
+      , (80, "pura mari")
+      , (81, "pura mari kiñe")
+      , (82, "pura mari epu")
+      , (83, "pura mari küla")
+      , (84, "pura mari meli")
+      , (85, "pura mari kechu")
+      , (86, "pura mari kayu")
+      , (87, "pura mari reqle")
+      , (88, "pura mari pura")
+      , (89, "pura mari aylla")
+      , (90, "aylla mari")
+      , (91, "aylla mari kiñe")
+      , (92, "aylla mari epu")
+      , (93, "aylla mari küla")
+      , (94, "aylla mari meli")
+      , (95, "aylla mari kechu")
+      , (96, "aylla mari kayu")
+      , (97, "aylla mari reqle")
+      , (98, "aylla mari pura")
+      , (99, "aylla mari aylla")
+      , (100, "kiñe pataka")
+      , (101, "kiñe pataka kiñe")
+      , (102, "kiñe pataka epu")
+      , (103, "kiñe pataka küla")
+      , (104, "kiñe pataka meli")
+      , (105, "kiñe pataka kechu")
+      , (106, "kiñe pataka kayu")
+      , (107, "kiñe pataka reqle")
+      , (108, "kiñe pataka pura")
+      , (109, "kiñe pataka aylla")
+      , (110, "kiñe pataka mari")
+      , (123, "kiñe pataka epu mari küla")
+      , (200, "epu pataka")
+      , (300, "küla pataka")
+      , (321, "küla pataka epu mari kiñe")
+      , (400, "meli pataka")
+      , (500, "kechu pataka")
+      , (600, "kayu pataka")
+      , (700, "reqle pataka")
+      , (800, "pura pataka")
+      , (900, "aylla pataka")
+      , (909, "aylla pataka aylla")
+      , (990, "aylla pataka aylla mari")
+      , (999, "aylla pataka aylla mari aylla")
+      , (1000, "kiñe warangka")
+      , (1001, "kiñe warangka kiñe")
+      , (1008, "kiñe warangka pura")
+      , (1234, "kiñe warangka epu pataka küla mari meli")
+      , (2000, "epu warangka")
+      , (3000, "küla warangka")
+      , (4000, "meli warangka")
+      , (4321, "meli warangka küla pataka epu mari kiñe")
+      , (5000, "kechu warangka")
+      , (6000, "kayu warangka")
+      , (7000, "reqle warangka")
+      , (8000, "pura warangka")
+      , (9000, "aylla warangka")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/AST/TestData.hs b/src-test/Text/Numeral/Language/AST/TestData.hs
--- a/src-test/Text/Numeral/Language/AST/TestData.hs
+++ b/src-test/Text/Numeral/Language/AST/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-asturian/en/ast/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/AZ/TestData.hs b/src-test/Text/Numeral/Language/AZ/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/AZ/TestData.hs
+++ /dev/null
@@ -1,206 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        az
-
-[@ISO639-2@]        aze
-
-[@ISO639-3@]        aze
-
-[@Native name@]     Azərbaycanca
-
-[@English name@]    Azerbaijani
--}
-module Text.Numeral.Language.AZ.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-azerbaijani/en/aze/
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "sıfır")
-      , (1, "bir")
-      , (2, "iki")
-      , (3, "üç")
-      , (4, "dörd")
-      , (5, "beş")
-      , (6, "altı")
-      , (7, "yeddi")
-      , (8, "səkkiz")
-      , (9, "doqquz")
-      , (10, "on")
-      , (11, "on bir")
-      , (12, "on iki")
-      , (13, "on uç")
-      , (14, "on dörd")
-      , (15, "on beş")
-      , (16, "on altı")
-      , (17, "on yeddi")
-      , (18, "on səkkiz")
-      , (19, "on doqquz")
-      , (20, "iyirmi")
-      , (21, "iyirmi bir")
-      , (22, "iyirmi iki")
-      , (23, "iyirmi uç")
-      , (24, "iyirmi dörd")
-      , (25, "iyirmi beş")
-      , (26, "iyirmi altı")
-      , (27, "iyirmi yeddi")
-      , (28, "iyirmi səkkiz")
-      , (29, "iyirmi doqquz")
-      , (30, "otuz")
-      , (31, "otuz bir")
-      , (32, "otuz iki")
-      , (33, "otuz uç")
-      , (34, "otuz dörd")
-      , (35, "otuz beş")
-      , (36, "otuz altı")
-      , (37, "otuz yeddi")
-      , (38, "otuz səkkiz")
-      , (39, "otuz doqquz")
-      , (40, "qırx")
-      , (41, "qırx bir")
-      , (42, "qırx iki")
-      , (43, "qırx uç")
-      , (44, "qırx dörd")
-      , (45, "qırx beş")
-      , (46, "qırx altı")
-      , (47, "qırx yeddi")
-      , (48, "qırx səkkiz")
-      , (49, "qırx doqquz")
-      , (50, "əlli")
-      , (51, "əlli bir")
-      , (52, "əlli iki")
-      , (53, "əlli uç")
-      , (54, "əlli dörd")
-      , (55, "əlli beş")
-      , (56, "əlli altı")
-      , (57, "əlli yeddi")
-      , (58, "əlli səkkiz")
-      , (59, "əlli doqquz")
-      , (60, "altmış")
-      , (61, "altmış bir")
-      , (62, "altmış iki")
-      , (63, "altmış uç")
-      , (64, "altmış dörd")
-      , (65, "altmış beş")
-      , (66, "altmış altı")
-      , (67, "altmış yeddi")
-      , (68, "altmış səkkiz")
-      , (69, "altmış doqquz")
-      , (70, "yetmiş")
-      , (71, "yetmiş bir")
-      , (72, "yetmiş iki")
-      , (73, "yetmiş uç")
-      , (74, "yetmiş dörd")
-      , (75, "yetmiş beş")
-      , (76, "yetmiş altı")
-      , (77, "yetmiş yeddi")
-      , (78, "yetmiş səkkiz")
-      , (79, "yetmiş doqquz")
-      , (80, "səksən")
-      , (81, "səksən bir")
-      , (82, "səksən iki")
-      , (83, "səksən uç")
-      , (84, "səksən dörd")
-      , (85, "səksən beş")
-      , (86, "səksən altı")
-      , (87, "səksən yeddi")
-      , (88, "səksən səkkiz")
-      , (89, "səksən doqquz")
-      , (90, "doxsan")
-      , (91, "doxsan bir")
-      , (92, "doxsan iki")
-      , (93, "doxsan uç")
-      , (94, "doxsan dörd")
-      , (95, "doxsan beş")
-      , (96, "doxsan altı")
-      , (97, "doxsan yeddi")
-      , (98, "doxsan səkkiz")
-      , (99, "doxsan doqquz")
-      , (100, "yüz")
-      , (101, "yüz bir")
-      , (102, "yüz iki")
-      , (103, "yüz uç")
-      , (104, "yüz dörd")
-      , (105, "yüz beş")
-      , (106, "yüz altı")
-      , (107, "yüz yeddi")
-      , (108, "yüz səkkiz")
-      , (109, "yüz doqquz")
-      , (110, "yüz on")
-      , (123, "yüz iyirmi uç")
-      , (200, "iki yüz")
-      , (300, "üç yüz")
-      , (321, "üç yüz iyirmi bir")
-      , (400, "dörd yüz")
-      , (500, "beş yüz")
-      , (600, "altı yüz")
-      , (700, "yeddi yüz")
-      , (800, "səkkiz yüz")
-      , (900, "doqquz yüz")
-      , (909, "doqquz yüz doqquz")
-      , (990, "doqquz yüz doxsan")
-      , (999, "doqquz yüz doxsan doqquz")
-      , (1000, "bir min")
-      , (1001, "bir min bir")
-      , (1008, "bir min səkkiz")
-      , (1234, "bir min iki yüz otuz dörd")
-      , (2000, "iki min")
-      , (3000, "üç min")
-      , (4000, "dörd min")
-      , (4321, "dörd min üç yüz iyirmi bir")
-      , (5000, "beş min")
-      , (6000, "altı min")
-      , (7000, "yeddi min")
-      , (8000, "səkkiz min")
-      , (9000, "doqquz min")
-      , (10000, "on min")
-      , (12345, "oniki min üç yüz qırx beş")
-      , (20000, "iyirmi min")
-      , (30000, "otuz min")
-      , (40000, "qırx min")
-      , (50000, "əlli min")
-      , (54321, "əlli dörd min üç yüz iyirmi bir")
-      , (60000, "altmış min")
-      , (70000, "yetmiş min")
-      , (80000, "səksən min")
-      , (90000, "doxsan min")
-      , (100000, "yüz min")
-      , (123456, "yüz iyirmi üç min dörd yüz əlli altı")
-      , (200000, "iki yüz min")
-      , (300000, "üç yüz min")
-      , (400000, "dörd yüz min")
-      , (500000, "beş yüz min")
-      , (600000, "altı yüz min")
-      , (654321, "altı yüz əlli dörd min üç yüz iyirmi bir")
-      , (700000, "yeddi yüz min")
-      , (800000, "səkkiz yüz min")
-      , (900000, "doqquz yüz min")
-      , (1000000, "bir milyon")
-      , (1000000000, "bir milyar")
-      , (1000000000000, "bir trilyon")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/AZE/TestData.hs b/src-test/Text/Numeral/Language/AZE/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/AZE/TestData.hs
@@ -0,0 +1,200 @@
+{-|
+[@ISO639-1@]        az
+
+[@ISO639-2@]        aze
+
+[@ISO639-3@]        aze
+
+[@Native name@]     Azərbaycanca
+
+[@English name@]    Azerbaijani
+-}
+module Text.Numeral.Language.AZE.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-azerbaijani/en/aze/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "sıfır")
+      , (1, "bir")
+      , (2, "iki")
+      , (3, "üç")
+      , (4, "dörd")
+      , (5, "beş")
+      , (6, "altı")
+      , (7, "yeddi")
+      , (8, "səkkiz")
+      , (9, "doqquz")
+      , (10, "on")
+      , (11, "on bir")
+      , (12, "on iki")
+      , (13, "on uç")
+      , (14, "on dörd")
+      , (15, "on beş")
+      , (16, "on altı")
+      , (17, "on yeddi")
+      , (18, "on səkkiz")
+      , (19, "on doqquz")
+      , (20, "iyirmi")
+      , (21, "iyirmi bir")
+      , (22, "iyirmi iki")
+      , (23, "iyirmi uç")
+      , (24, "iyirmi dörd")
+      , (25, "iyirmi beş")
+      , (26, "iyirmi altı")
+      , (27, "iyirmi yeddi")
+      , (28, "iyirmi səkkiz")
+      , (29, "iyirmi doqquz")
+      , (30, "otuz")
+      , (31, "otuz bir")
+      , (32, "otuz iki")
+      , (33, "otuz uç")
+      , (34, "otuz dörd")
+      , (35, "otuz beş")
+      , (36, "otuz altı")
+      , (37, "otuz yeddi")
+      , (38, "otuz səkkiz")
+      , (39, "otuz doqquz")
+      , (40, "qırx")
+      , (41, "qırx bir")
+      , (42, "qırx iki")
+      , (43, "qırx uç")
+      , (44, "qırx dörd")
+      , (45, "qırx beş")
+      , (46, "qırx altı")
+      , (47, "qırx yeddi")
+      , (48, "qırx səkkiz")
+      , (49, "qırx doqquz")
+      , (50, "əlli")
+      , (51, "əlli bir")
+      , (52, "əlli iki")
+      , (53, "əlli uç")
+      , (54, "əlli dörd")
+      , (55, "əlli beş")
+      , (56, "əlli altı")
+      , (57, "əlli yeddi")
+      , (58, "əlli səkkiz")
+      , (59, "əlli doqquz")
+      , (60, "altmış")
+      , (61, "altmış bir")
+      , (62, "altmış iki")
+      , (63, "altmış uç")
+      , (64, "altmış dörd")
+      , (65, "altmış beş")
+      , (66, "altmış altı")
+      , (67, "altmış yeddi")
+      , (68, "altmış səkkiz")
+      , (69, "altmış doqquz")
+      , (70, "yetmiş")
+      , (71, "yetmiş bir")
+      , (72, "yetmiş iki")
+      , (73, "yetmiş uç")
+      , (74, "yetmiş dörd")
+      , (75, "yetmiş beş")
+      , (76, "yetmiş altı")
+      , (77, "yetmiş yeddi")
+      , (78, "yetmiş səkkiz")
+      , (79, "yetmiş doqquz")
+      , (80, "səksən")
+      , (81, "səksən bir")
+      , (82, "səksən iki")
+      , (83, "səksən uç")
+      , (84, "səksən dörd")
+      , (85, "səksən beş")
+      , (86, "səksən altı")
+      , (87, "səksən yeddi")
+      , (88, "səksən səkkiz")
+      , (89, "səksən doqquz")
+      , (90, "doxsan")
+      , (91, "doxsan bir")
+      , (92, "doxsan iki")
+      , (93, "doxsan uç")
+      , (94, "doxsan dörd")
+      , (95, "doxsan beş")
+      , (96, "doxsan altı")
+      , (97, "doxsan yeddi")
+      , (98, "doxsan səkkiz")
+      , (99, "doxsan doqquz")
+      , (100, "yüz")
+      , (101, "yüz bir")
+      , (102, "yüz iki")
+      , (103, "yüz uç")
+      , (104, "yüz dörd")
+      , (105, "yüz beş")
+      , (106, "yüz altı")
+      , (107, "yüz yeddi")
+      , (108, "yüz səkkiz")
+      , (109, "yüz doqquz")
+      , (110, "yüz on")
+      , (123, "yüz iyirmi uç")
+      , (200, "iki yüz")
+      , (300, "üç yüz")
+      , (321, "üç yüz iyirmi bir")
+      , (400, "dörd yüz")
+      , (500, "beş yüz")
+      , (600, "altı yüz")
+      , (700, "yeddi yüz")
+      , (800, "səkkiz yüz")
+      , (900, "doqquz yüz")
+      , (909, "doqquz yüz doqquz")
+      , (990, "doqquz yüz doxsan")
+      , (999, "doqquz yüz doxsan doqquz")
+      , (1000, "bir min")
+      , (1001, "bir min bir")
+      , (1008, "bir min səkkiz")
+      , (1234, "bir min iki yüz otuz dörd")
+      , (2000, "iki min")
+      , (3000, "üç min")
+      , (4000, "dörd min")
+      , (4321, "dörd min üç yüz iyirmi bir")
+      , (5000, "beş min")
+      , (6000, "altı min")
+      , (7000, "yeddi min")
+      , (8000, "səkkiz min")
+      , (9000, "doqquz min")
+      , (10000, "on min")
+      , (12345, "oniki min üç yüz qırx beş")
+      , (20000, "iyirmi min")
+      , (30000, "otuz min")
+      , (40000, "qırx min")
+      , (50000, "əlli min")
+      , (54321, "əlli dörd min üç yüz iyirmi bir")
+      , (60000, "altmış min")
+      , (70000, "yetmiş min")
+      , (80000, "səksən min")
+      , (90000, "doxsan min")
+      , (100000, "yüz min")
+      , (123456, "yüz iyirmi üç min dörd yüz əlli altı")
+      , (200000, "iki yüz min")
+      , (300000, "üç yüz min")
+      , (400000, "dörd yüz min")
+      , (500000, "beş yüz min")
+      , (600000, "altı yüz min")
+      , (654321, "altı yüz əlli dörd min üç yüz iyirmi bir")
+      , (700000, "yeddi yüz min")
+      , (800000, "səkkiz yüz min")
+      , (900000, "doqquz yüz min")
+      , (1000000, "bir milyon")
+      , (1000000000, "bir milyar")
+      , (1000000000000, "bir trilyon")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/BA/TestData.hs b/src-test/Text/Numeral/Language/BA/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/BA/TestData.hs
+++ /dev/null
@@ -1,180 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        ba
-
-[@ISO639-2@]        bak
-
-[@ISO639-3@]        bak
-
-[@Native name@]     Башҡорт теле
-
-[@English name@]    Bashkir
--}
-module Text.Numeral.Language.BA.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-bashkir/en/bak/
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "бер")
-      , (2, "ике")
-      , (3, "өс")
-      , (4, "дүрт")
-      , (5, "биш")
-      , (6, "алты")
-      , (7, "ете")
-      , (8, "һигеҙ")
-      , (9, "туғыҙ")
-      , (10, "ун")
-      , (11, "ун бер")
-      , (12, "ун ике")
-      , (13, "ун өс")
-      , (14, "ун дүрт")
-      , (15, "ун биш")
-      , (16, "ун алты")
-      , (17, "ун ете")
-      , (18, "ун һигеҙ")
-      , (19, "ун туғыҙ")
-      , (20, "егерме")
-      , (21, "егерме бер")
-      , (22, "егерме ике")
-      , (23, "егерме өс")
-      , (24, "егерме дүрт")
-      , (25, "егерме биш")
-      , (26, "егерме алты")
-      , (27, "егерме ете")
-      , (28, "егерме һигеҙ")
-      , (29, "егерме туғыҙ")
-      , (30, "утыҙ")
-      , (31, "утыҙ бер")
-      , (32, "утыҙ ике")
-      , (33, "утыҙ өс")
-      , (34, "утыҙ дүрт")
-      , (35, "утыҙ биш")
-      , (36, "утыҙ алты")
-      , (37, "утыҙ ете")
-      , (38, "утыҙ һигеҙ")
-      , (39, "утыҙ туғыҙ")
-      , (40, "ҡырҡ")
-      , (41, "ҡырҡ бер")
-      , (42, "ҡырҡ ике")
-      , (43, "ҡырҡ өс")
-      , (44, "ҡырҡ дүрт")
-      , (45, "ҡырҡ биш")
-      , (46, "ҡырҡ алты")
-      , (47, "ҡырҡ ете")
-      , (48, "ҡырҡ һигеҙ")
-      , (49, "ҡырҡ туғыҙ")
-      , (50, "илле")
-      , (51, "илле бер")
-      , (52, "илле ике")
-      , (53, "илле өс")
-      , (54, "илле дүрт")
-      , (55, "илле биш")
-      , (56, "илле алты")
-      , (57, "илле ете")
-      , (58, "илле һигеҙ")
-      , (59, "илле туғыҙ")
-      , (60, "алтмыш")
-      , (61, "алтмыш бер")
-      , (62, "алтмыш ике")
-      , (63, "алтмыш өс")
-      , (64, "алтмыш дүрт")
-      , (65, "алтмыш биш")
-      , (66, "алтмыш алты")
-      , (67, "алтмыш ете")
-      , (68, "алтмыш һигеҙ")
-      , (69, "алтмыш туғыҙ")
-      , (70, "етмеш")
-      , (71, "етмеш бер")
-      , (72, "етмеш ике")
-      , (73, "етмеш өс")
-      , (74, "етмеш дүрт")
-      , (75, "етмеш биш")
-      , (76, "етмеш алты")
-      , (77, "етмеш ете")
-      , (78, "етмеш һигеҙ")
-      , (79, "етмеш туғыҙ")
-      , (80, "һикһән")
-      , (81, "һикһән бер")
-      , (82, "һикһән ике")
-      , (83, "һикһән өс")
-      , (84, "һикһән дүрт")
-      , (85, "һикһән биш")
-      , (86, "һикһән алты")
-      , (87, "һикһән ете")
-      , (88, "һикһән һигеҙ")
-      , (89, "һикһән туғыҙ")
-      , (90, "туҡһан")
-      , (91, "туҡһан бер")
-      , (92, "туҡһан ике")
-      , (93, "туҡһан өс")
-      , (94, "туҡһан дүрт")
-      , (95, "туҡһан биш")
-      , (96, "туҡһан алты")
-      , (97, "туҡһан ете")
-      , (98, "туҡһан һигеҙ")
-      , (99, "туҡһан туғыҙ")
-      , (100, "йөҙ")
-      , (101, "йөҙ бер")
-      , (102, "йөҙ ике")
-      , (103, "йөҙ өс")
-      , (104, "йөҙ дүрт")
-      , (105, "йөҙ биш")
-      , (106, "йөҙ алты")
-      , (107, "йөҙ ете")
-      , (108, "йөҙ һигеҙ")
-      , (109, "йөҙ туғыҙ")
-      , (110, "йөҙ ун")
-      , (123, "йөҙ егерме өс")
-      , (200, "ике йөҙ")
-      , (300, "өс йөҙ")
-      , (321, "өс йөҙ егерме бер")
-      , (400, "дүрт йөҙ")
-      , (500, "биш йөҙ")
-      , (600, "алты йөҙ")
-      , (700, "ете йөҙ")
-      , (800, "һигеҙ йөҙ")
-      , (900, "туғыҙ йөҙ")
-      , (909, "туғыҙ йөҙ туғыҙ")
-      , (990, "туғыҙ йөҙ туҡһан")
-      , (999, "туғыҙ йөҙ туҡһан туғыҙ")
-      , (1000, "мең")
-      , (1001, "мең бер")
-      , (1008, "мең һигеҙ")
-      , (1234, "мең ике йөҙ утыҙ дүрт")
-      , (2000, "ике мең")
-      , (3000, "өс мең")
-      , (4000, "дүрт мең")
-      , (4321, "дүрт мең өс йөҙ егерме бер")
-      , (5000, "биш мең")
-      , (6000, "алты мең")
-      , (7000, "ете мең")
-      , (8000, "һигеҙ мең")
-      , (9000, "туғыҙ мең")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/BAK/TestData.hs b/src-test/Text/Numeral/Language/BAK/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/BAK/TestData.hs
@@ -0,0 +1,174 @@
+{-|
+[@ISO639-1@]        ba
+
+[@ISO639-2@]        bak
+
+[@ISO639-3@]        bak
+
+[@Native name@]     Башҡорт теле
+
+[@English name@]    Bashkir
+-}
+module Text.Numeral.Language.BAK.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-bashkir/en/bak/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "бер")
+      , (2, "ике")
+      , (3, "өс")
+      , (4, "дүрт")
+      , (5, "биш")
+      , (6, "алты")
+      , (7, "ете")
+      , (8, "һигеҙ")
+      , (9, "туғыҙ")
+      , (10, "ун")
+      , (11, "ун бер")
+      , (12, "ун ике")
+      , (13, "ун өс")
+      , (14, "ун дүрт")
+      , (15, "ун биш")
+      , (16, "ун алты")
+      , (17, "ун ете")
+      , (18, "ун һигеҙ")
+      , (19, "ун туғыҙ")
+      , (20, "егерме")
+      , (21, "егерме бер")
+      , (22, "егерме ике")
+      , (23, "егерме өс")
+      , (24, "егерме дүрт")
+      , (25, "егерме биш")
+      , (26, "егерме алты")
+      , (27, "егерме ете")
+      , (28, "егерме һигеҙ")
+      , (29, "егерме туғыҙ")
+      , (30, "утыҙ")
+      , (31, "утыҙ бер")
+      , (32, "утыҙ ике")
+      , (33, "утыҙ өс")
+      , (34, "утыҙ дүрт")
+      , (35, "утыҙ биш")
+      , (36, "утыҙ алты")
+      , (37, "утыҙ ете")
+      , (38, "утыҙ һигеҙ")
+      , (39, "утыҙ туғыҙ")
+      , (40, "ҡырҡ")
+      , (41, "ҡырҡ бер")
+      , (42, "ҡырҡ ике")
+      , (43, "ҡырҡ өс")
+      , (44, "ҡырҡ дүрт")
+      , (45, "ҡырҡ биш")
+      , (46, "ҡырҡ алты")
+      , (47, "ҡырҡ ете")
+      , (48, "ҡырҡ һигеҙ")
+      , (49, "ҡырҡ туғыҙ")
+      , (50, "илле")
+      , (51, "илле бер")
+      , (52, "илле ике")
+      , (53, "илле өс")
+      , (54, "илле дүрт")
+      , (55, "илле биш")
+      , (56, "илле алты")
+      , (57, "илле ете")
+      , (58, "илле һигеҙ")
+      , (59, "илле туғыҙ")
+      , (60, "алтмыш")
+      , (61, "алтмыш бер")
+      , (62, "алтмыш ике")
+      , (63, "алтмыш өс")
+      , (64, "алтмыш дүрт")
+      , (65, "алтмыш биш")
+      , (66, "алтмыш алты")
+      , (67, "алтмыш ете")
+      , (68, "алтмыш һигеҙ")
+      , (69, "алтмыш туғыҙ")
+      , (70, "етмеш")
+      , (71, "етмеш бер")
+      , (72, "етмеш ике")
+      , (73, "етмеш өс")
+      , (74, "етмеш дүрт")
+      , (75, "етмеш биш")
+      , (76, "етмеш алты")
+      , (77, "етмеш ете")
+      , (78, "етмеш һигеҙ")
+      , (79, "етмеш туғыҙ")
+      , (80, "һикһән")
+      , (81, "һикһән бер")
+      , (82, "һикһән ике")
+      , (83, "һикһән өс")
+      , (84, "һикһән дүрт")
+      , (85, "һикһән биш")
+      , (86, "һикһән алты")
+      , (87, "һикһән ете")
+      , (88, "һикһән һигеҙ")
+      , (89, "һикһән туғыҙ")
+      , (90, "туҡһан")
+      , (91, "туҡһан бер")
+      , (92, "туҡһан ике")
+      , (93, "туҡһан өс")
+      , (94, "туҡһан дүрт")
+      , (95, "туҡһан биш")
+      , (96, "туҡһан алты")
+      , (97, "туҡһан ете")
+      , (98, "туҡһан һигеҙ")
+      , (99, "туҡһан туғыҙ")
+      , (100, "йөҙ")
+      , (101, "йөҙ бер")
+      , (102, "йөҙ ике")
+      , (103, "йөҙ өс")
+      , (104, "йөҙ дүрт")
+      , (105, "йөҙ биш")
+      , (106, "йөҙ алты")
+      , (107, "йөҙ ете")
+      , (108, "йөҙ һигеҙ")
+      , (109, "йөҙ туғыҙ")
+      , (110, "йөҙ ун")
+      , (123, "йөҙ егерме өс")
+      , (200, "ике йөҙ")
+      , (300, "өс йөҙ")
+      , (321, "өс йөҙ егерме бер")
+      , (400, "дүрт йөҙ")
+      , (500, "биш йөҙ")
+      , (600, "алты йөҙ")
+      , (700, "ете йөҙ")
+      , (800, "һигеҙ йөҙ")
+      , (900, "туғыҙ йөҙ")
+      , (909, "туғыҙ йөҙ туғыҙ")
+      , (990, "туғыҙ йөҙ туҡһан")
+      , (999, "туғыҙ йөҙ туҡһан туғыҙ")
+      , (1000, "мең")
+      , (1001, "мең бер")
+      , (1008, "мең һигеҙ")
+      , (1234, "мең ике йөҙ утыҙ дүрт")
+      , (2000, "ике мең")
+      , (3000, "өс мең")
+      , (4000, "дүрт мең")
+      , (4321, "дүрт мең өс йөҙ егерме бер")
+      , (5000, "биш мең")
+      , (6000, "алты мең")
+      , (7000, "ете мең")
+      , (8000, "һигеҙ мең")
+      , (9000, "туғыҙ мең")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/BAM/TestData.hs b/src-test/Text/Numeral/Language/BAM/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/BAM/TestData.hs
@@ -0,0 +1,197 @@
+{-|
+[@ISO639-1@]        bm
+
+[@ISO639-2@]        bam
+
+[@ISO639-3@]        bam
+
+[@Native name@]     -
+
+[@English name@]    Bambara
+-}
+module Text.Numeral.Language.BAM.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-bambara/en/bam/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "kélen")
+      , (2, "fila")
+      , (3, "sàba")
+      , (4, "náani")
+      , (5, "dúuru")
+      , (6, "wɔɔrɔ")
+      , (7, "wólonwula")
+      , (8, "séegin")
+      , (9, "k̀ɔnɔntɔn")
+      , (10, "tán")
+      , (11, "tán ní kélen")
+      , (12, "tán ní fila")
+      , (13, "tán ní sàba")
+      , (14, "tán ní náani")
+      , (15, "tán ní dúuru")
+      , (16, "tán ní wɔɔrɔ")
+      , (17, "tán ní wólonwula")
+      , (18, "tán ní séegin")
+      , (19, "tán ní k̀ɔnɔntɔn")
+      , (20, "mùgan")
+      , (21, "mùgan ní kélen")
+      , (22, "mùgan ní fila")
+      , (23, "mùgan ní sàba")
+      , (24, "mùgan ní náani")
+      , (25, "mùgan ní dúuru")
+      , (26, "mùgan ní wɔɔrɔ")
+      , (27, "mùgan ní wólonwula")
+      , (28, "mùgan ní séegin")
+      , (29, "mùgan ní k̀ɔnɔntɔn")
+      , (30, "bísàba")
+      , (31, "bísàba ní kélen")
+      , (32, "bísàba ní fila")
+      , (33, "bísàba ní sàba")
+      , (34, "bísàba ní náani")
+      , (35, "bísàba ní dúuru")
+      , (36, "bísàba ní wɔɔrɔ")
+      , (37, "bísàba ní wólonwula")
+      , (38, "bísàba ní séegin")
+      , (39, "bísàba ní k̀ɔnɔntɔn")
+      , (40, "bínaani")
+      , (41, "bínaani ní kélen")
+      , (42, "bínaani ní fila")
+      , (43, "bínaani ní sàba")
+      , (44, "bínaani ní náani")
+      , (45, "bínaani ní dúuru")
+      , (46, "bínaani ní wɔɔrɔ")
+      , (47, "bínaani ní wólonwula")
+      , (48, "bínaani ní séegin")
+      , (49, "bínaani ní k̀ɔnɔntɔn")
+      , (50, "bídúuru")
+      , (51, "bídúuru ní kélen")
+      , (52, "bídúuru ní fila")
+      , (53, "bídúuru ní sàba")
+      , (54, "bídúuru ní náani")
+      , (55, "bídúuru ní dúuru")
+      , (56, "bídúuru ní wɔɔrɔ")
+      , (57, "bídúuru ní wólonwula")
+      , (58, "bídúuru ní séegin")
+      , (59, "bídúuru ní k̀ɔnɔntɔn")
+      , (60, "bíwɔɔrɔ")
+      , (61, "bíwɔɔrɔ ní kélen")
+      , (62, "bíwɔɔrɔ ní fila")
+      , (63, "bíwɔɔrɔ ní sàba")
+      , (64, "bíwɔɔrɔ ní náani")
+      , (65, "bíwɔɔrɔ ní dúuru")
+      , (66, "bíwɔɔrɔ ní wɔɔrɔ")
+      , (67, "bíwɔɔrɔ ní wólonwula")
+      , (68, "bíwɔɔrɔ ní séegin")
+      , (69, "bíwɔɔrɔ ní k̀ɔnɔntɔn")
+      , (70, "bíwolonfila")
+      , (71, "bíwolonfila ní kélen")
+      , (72, "bíwolonfila ní fila")
+      , (73, "bíwolonfila ní sàba")
+      , (74, "bíwolonfila ní náani")
+      , (75, "bíwolonfila ní dúuru")
+      , (76, "bíwolonfila ní wɔɔrɔ")
+      , (77, "bíwolonfila ní wólonwula")
+      , (78, "bíwolonfila ní séegin")
+      , (79, "bíwolonfila ní k̀ɔnɔntɔn")
+      , (80, "bíséegin")
+      , (81, "bíséegin ní kélen")
+      , (82, "bíséegin ní fila")
+      , (83, "bíséegin ní sàba")
+      , (84, "bíséegin ní náani")
+      , (85, "bíséegin ní dúuru")
+      , (86, "bíséegin ní wɔɔrɔ")
+      , (87, "bíséegin ní wólonwula")
+      , (88, "bíséegin ní séegin")
+      , (89, "bíséegin ní k̀ɔnɔntɔn")
+      , (90, "bík̀ɔnɔntɔn")
+      , (91, "bík̀ɔnɔntɔn ní kélen")
+      , (92, "bík̀ɔnɔntɔn ní fila")
+      , (93, "bík̀ɔnɔntɔn ní sàba")
+      , (94, "bík̀ɔnɔntɔn ní náani")
+      , (95, "bík̀ɔnɔntɔn ní dúuru")
+      , (96, "bík̀ɔnɔntɔn ní wɔɔrɔ")
+      , (97, "bík̀ɔnɔntɔn ní wólonwula")
+      , (98, "bík̀ɔnɔntɔn ní séegin")
+      , (99, "bík̀ɔnɔntɔn ní k̀ɔnɔntɔn")
+      , (100, "k̀ɛmɛ")
+      , (101, "k̀ɛmɛ ní kélen")
+      , (102, "k̀ɛmɛ ní fila")
+      , (103, "k̀ɛmɛ ní sàba")
+      , (104, "k̀ɛmɛ ní náani")
+      , (105, "k̀ɛmɛ ní dúuru")
+      , (106, "k̀ɛmɛ ní wɔɔrɔ")
+      , (107, "k̀ɛmɛ ní wólonwula")
+      , (108, "k̀ɛmɛ ní séegin")
+      , (109, "k̀ɛmɛ ní k̀ɔnɔntɔn")
+      , (110, "k̀ɛmɛ ní tán")
+      , (123, "k̀ɛmɛ ní mùgan ní sàba")
+      , (200, "k̀ɛmɛ fila")
+      , (300, "k̀ɛmɛ sàba")
+      , (321, "k̀ɛmɛ sàba ní mùgan ní kélen")
+      , (400, "k̀ɛmɛ náani")
+      , (500, "k̀ɛmɛ dúuru")
+      , (600, "k̀ɛmɛ wɔɔrɔ")
+      , (700, "wólonwula k̀ɛmɛ")
+      , (800, "séegin k̀ɛmɛ")
+      , (900, "k̀ɔnɔntɔn k̀ɛmɛ")
+      , (909, "k̀ɔnɔntɔn k̀ɛmɛ ní k̀ɔnɔntɔn")
+      , (990, "k̀ɔnɔntɔn k̀ɛmɛ ní bík̀ɔnɔntɔn")
+      , (999, "k̀ɔnɔntɔn k̀ɛmɛ ní bík̀ɔnɔntɔn ní k̀ɔnɔntɔn")
+      , (1000, "wa kélen")
+      , (1001, "wa kélen ní kélen")
+      , (1008, "wa kélen ní séegin")
+      , (1234, "wa kélen ní k̀ɛmɛ fila ní bísàba ní náani")
+      , (2000, "wa fila")
+      , (3000, "wa sàba")
+      , (4000, "wa náani")
+      , (4321, "wa náani ní k̀ɛmɛ sàba ní mùgan ní kélen")
+      , (5000, "wa dúuru")
+      , (6000, "wa wɔɔrɔ")
+      , (7000, "wólonwula wa")
+      , (8000, "séegin wa")
+      , (9000, "k̀ɔnɔntɔn wa")
+      , (10000, "tán wa")
+      , (12345, "tán ní wa fila ní k̀ɛmɛ sàba ní bínaani ní dúuru")
+      , (20000, "mùgan wa")
+      , (30000, "bíwa sàba")
+      , (40000, "bínaani wa")
+      , (50000, "bíwa dúuru")
+      , (54321, "bídúuru ní wa náani ní k̀ɛmɛ sàba ní mùgan ní kélen")
+      , (60000, "bíwa wɔɔrɔ")
+      , (70000, "bíwa wolonfila")
+      , (80000, "bíséegin wa")
+      , (90000, "bík̀ɔnɔntɔn wa")
+      , (100000, "k̀ɛmɛ wa")
+      , (123456, "k̀ɛmɛ ní mùgan ní wa sàba ní k̀ɛmɛ náani ní bídúuru ní wɔɔrɔ")
+      , (200000, "k̀ɛmɛ fila wa")
+      , (300000, "k̀ɛmɛ sàba wa")
+      , (400000, "k̀ɛmɛ náani wa")
+      , (500000, "k̀ɛmɛ dúuru wa")
+      , (600000, "k̀ɛmɛ wɔɔrɔ wa")
+      , (654321, "k̀ɛmɛ wɔɔrɔ ní bídúuru ní wa náani ní k̀ɛmɛ sàba ní mùgan ní kélen")
+      , (700000, "wólonwula k̀ɛmɛ wa")
+      , (800000, "séegin k̀ɛmɛ wa")
+      , (900000, "k̀ɔnɔntɔn k̀ɛmɛ wa")
+      , (1000000, "mílyɔn kélen")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/BG/TestData.hs b/src-test/Text/Numeral/Language/BG/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/BG/TestData.hs
+++ /dev/null
@@ -1,237 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        bg
-
-[@ISO639-2@]        bul
-
-[@ISO639-3@]        bul
-
-[@Native name@]     български език
-
-[@English name@]    Bulgarian
--}
-
-module Text.Numeral.Language.BG.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral, (+) )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-bulgarian/en/bul/
-  http://en.wikipedia.org/wiki/Bulgarian_grammar#Numbers
-  http://bg.wikipedia.org/wiki/Имена_на_числата
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "neuter"
-    , neuter defaultInflection
-    , [ (-3, "минус три")
-      , (0, "нула")
-      , (1, "едно")
-      , (2, "две")
-      , (3, "три")
-      , (4, "четири")
-      , (5, "пет")
-      , (6, "шест")
-      , (7, "седем")
-      , (8, "осем")
-      , (9, "девет")
-      , (10, "десет")
-      , (11, "единадесет")
-      , (12, "дванадесет")
-      , (13, "тринадесет")
-      , (14, "четиринадесет")
-      , (15, "петнадесет")
-      , (16, "шестнадесет")
-      , (17, "седемнадесет")
-      , (18, "осемнадесет")
-      , (19, "деветнадесет")
-      , (20, "двадесет")
-      , (21, "двадесет и едно")
-      , (22, "двадесет и две")
-      , (23, "двадесет и три")
-      , (24, "двадесет и четири")
-      , (25, "двадесет и пет")
-      , (26, "двадесет и шест")
-      , (27, "двадесет и седем")
-      , (28, "двадесет и осем")
-      , (29, "двадесет и девет")
-      , (30, "тридесет")
-      , (31, "тридесет и едно")
-      , (32, "тридесет и две")
-      , (33, "тридесет и три")
-      , (34, "тридесет и четири")
-      , (35, "тридесет и пет")
-      , (36, "тридесет и шест")
-      , (37, "тридесет и седем")
-      , (38, "тридесет и осем")
-      , (39, "тридесет и девет")
-      , (40, "четиридесет")
-      , (41, "четиридесет и едно")
-      , (42, "четиридесет и две")
-      , (43, "четиридесет и три")
-      , (44, "четиридесет и четири")
-      , (45, "четиридесет и пет")
-      , (46, "четиридесет и шест")
-      , (47, "четиридесет и седем")
-      , (48, "четиридесет и осем")
-      , (49, "четиридесет и девет")
-      , (50, "петдесет")
-      , (51, "петдесет и едно")
-      , (52, "петдесет и две")
-      , (53, "петдесет и три")
-      , (54, "петдесет и четири")
-      , (55, "петдесет и пет")
-      , (56, "петдесет и шест")
-      , (57, "петдесет и седем")
-      , (58, "петдесет и осем")
-      , (59, "петдесет и девет")
-      , (60, "шестдесет")
-      , (61, "шестдесет и едно")
-      , (62, "шестдесет и две")
-      , (63, "шестдесет и три")
-      , (64, "шестдесет и четири")
-      , (65, "шестдесет и пет")
-      , (66, "шестдесет и шест")
-      , (67, "шестдесет и седем")
-      , (68, "шестдесет и осем")
-      , (69, "шестдесет и девет")
-      , (70, "седемдесет")
-      , (71, "седемдесет и едно")
-      , (72, "седемдесет и две")
-      , (73, "седемдесет и три")
-      , (74, "седемдесет и четири")
-      , (75, "седемдесет и пет")
-      , (76, "седемдесет и шест")
-      , (77, "седемдесет и седем")
-      , (78, "седемдесет и осем")
-      , (79, "седемдесет и девет")
-      , (80, "осемдесет")
-      , (81, "осемдесет и едно")
-      , (82, "осемдесет и две")
-      , (83, "осемдесет и три")
-      , (84, "осемдесет и четири")
-      , (85, "осемдесет и пет")
-      , (86, "осемдесет и шест")
-      , (87, "осемдесет и седем")
-      , (88, "осемдесет и осем")
-      , (89, "осемдесет и девет")
-      , (90, "деветдесет")
-      , (91, "деветдесет и едно")
-      , (92, "деветдесет и две")
-      , (93, "деветдесет и три")
-      , (94, "деветдесет и четири")
-      , (95, "деветдесет и пет")
-      , (96, "деветдесет и шест")
-      , (97, "деветдесет и седем")
-      , (98, "деветдесет и осем")
-      , (99, "деветдесет и девет")
-      , (100, "сто")
-      , (101, "сто и едно")
-      , (102, "сто и две")
-      , (110, "сто и десет")
-      , (115, "сто и петнадесет")
-      , (120, "сто и двадесет")
-      , (121, "сто двадесет и едно")
-      , (130, "сто и тридесет")
-      , (133, "сто тридесет и три")
-      , (200, "двеста")
-      , (202, "двеста и две")
-      , (216, "двеста и шестнадесет")
-      , (265, "двеста шестдесет и пет")
-      , (300, "триста")
-      , (400, "четиристотин")
-      , (500, "петстотин")
-      , (507, "петстотин и седем")
-      , (600, "шестстотин")
-      , (700, "седемстотин")
-      , (800, "осемстотин")
-      , (900, "деветстотин")
-      , (1000, "хиляда")
-      , (1234, "хиляда двеста тридесет и четири")
-      , (2000, "две хиляди")
-      , (3000, "три хиляди")
-      , (5000, "пет хиляди")
-      , (6000, "шест хиляди")
-      , (9000, "девет хиляди")
-      , (16000, "шестнадесет хиляди")
-      , (21000, "двадесет и едно хиляди")
-      , (22000, "двадесет и две хиляди")
-      , (22136, "двадесет и две хиляди сто тридесет и шест")
-      , (23000, "двадесет и три хиляди")
-      , (28000, "двадесет и осем хиляди")
-      , (41000, "четиридесет и едно хиляди")
-      , (42000, "четиридесет и две хиляди")
-      , (49000, "четиридесет и девет хиляди")
-      , (100000, "сто хиляди")
-      , (200000, "двеста хиляди")
-      , (255383, "двеста петдесет и пет хиляди триста осемдесет и три")
-      , (300000, "триста хиляди")
-      , (300001, "триста хиляди и едно")
-      , (300020, "триста хиляди и двадесет")
-      , (300825, "триста хиляди осемстотин двадесет и пет")
-      , (dec 6, "един милион")
-      , (1300825, "един милион триста хиляди осемстотин двадесет и пет")
-      , (1021000, "един милион двадесет и едно хиляди")
-      , (1001234, "един милион хиляда двеста тридесет и четири")
-      , (1000216, "един милион двеста и шестнадесет")
-      , (1000074, "един милион седемдесет и четири")
-      , (1000004, "един милион и четири")
-      , (2 ⋅ dec 6, "два милиона")
-      , (5 ⋅ dec 6, "пет милиона")
-      , (dec 9, "един милиард")
-      , (2 ⋅ dec 9, "два милиарда")
-      , (3 ⋅ dec 12, "три трилиона")
-      , (dec 15, "един квадрилион")
-      , (15 ⋅ dec 15 + 41, "петнадесет квадрилиона четиридесет и едно")
-      , (dec 18, "един квинтилион")
-      , (dec 21, "един секстилион")
-      , (dec 24, "един септилион")
-      , (dec 27, "един октилион")
-      , (dec 30, "един нонилион")
-      , (dec 33, "един децилион")
-      , (dec 36, "един индецилион")
-      , (dec 39, "един дуодецилион")
-      , (dec 42, "един тридецилион")
-      , (dec 45, "един куадродецилион")
-      , (900 ⋅ dec 45, "деветстотин куадродецилиона")
-      ]
-    )
-    , ( "feminine"
-      , feminine defaultInflection
-      , [ (1, "една")
-        , (2, "две")
-        , (200, "двеста")
-        , (202, "двеста и две")
-        ]
-      )
-    , ( "masculine"
-      , masculine defaultInflection
-      , [ (1, "един")
-        , (2, "два")
-        , (200, "двеста")
-        , (202, "двеста и два")
-        ]
-      )
-  ]
diff --git a/src-test/Text/Numeral/Language/BM/TestData.hs b/src-test/Text/Numeral/Language/BM/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/BM/TestData.hs
+++ /dev/null
@@ -1,203 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        bm
-
-[@ISO639-2@]        bam
-
-[@ISO639-3@]        bam
-
-[@Native name@]     -
-
-[@English name@]    Bambara
--}
-module Text.Numeral.Language.BM.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-bambara/en/bam/
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "kélen")
-      , (2, "fila")
-      , (3, "sàba")
-      , (4, "náani")
-      , (5, "dúuru")
-      , (6, "wɔɔrɔ")
-      , (7, "wólonwula")
-      , (8, "séegin")
-      , (9, "k̀ɔnɔntɔn")
-      , (10, "tán")
-      , (11, "tán ní kélen")
-      , (12, "tán ní fila")
-      , (13, "tán ní sàba")
-      , (14, "tán ní náani")
-      , (15, "tán ní dúuru")
-      , (16, "tán ní wɔɔrɔ")
-      , (17, "tán ní wólonwula")
-      , (18, "tán ní séegin")
-      , (19, "tán ní k̀ɔnɔntɔn")
-      , (20, "mùgan")
-      , (21, "mùgan ní kélen")
-      , (22, "mùgan ní fila")
-      , (23, "mùgan ní sàba")
-      , (24, "mùgan ní náani")
-      , (25, "mùgan ní dúuru")
-      , (26, "mùgan ní wɔɔrɔ")
-      , (27, "mùgan ní wólonwula")
-      , (28, "mùgan ní séegin")
-      , (29, "mùgan ní k̀ɔnɔntɔn")
-      , (30, "bísàba")
-      , (31, "bísàba ní kélen")
-      , (32, "bísàba ní fila")
-      , (33, "bísàba ní sàba")
-      , (34, "bísàba ní náani")
-      , (35, "bísàba ní dúuru")
-      , (36, "bísàba ní wɔɔrɔ")
-      , (37, "bísàba ní wólonwula")
-      , (38, "bísàba ní séegin")
-      , (39, "bísàba ní k̀ɔnɔntɔn")
-      , (40, "bínaani")
-      , (41, "bínaani ní kélen")
-      , (42, "bínaani ní fila")
-      , (43, "bínaani ní sàba")
-      , (44, "bínaani ní náani")
-      , (45, "bínaani ní dúuru")
-      , (46, "bínaani ní wɔɔrɔ")
-      , (47, "bínaani ní wólonwula")
-      , (48, "bínaani ní séegin")
-      , (49, "bínaani ní k̀ɔnɔntɔn")
-      , (50, "bídúuru")
-      , (51, "bídúuru ní kélen")
-      , (52, "bídúuru ní fila")
-      , (53, "bídúuru ní sàba")
-      , (54, "bídúuru ní náani")
-      , (55, "bídúuru ní dúuru")
-      , (56, "bídúuru ní wɔɔrɔ")
-      , (57, "bídúuru ní wólonwula")
-      , (58, "bídúuru ní séegin")
-      , (59, "bídúuru ní k̀ɔnɔntɔn")
-      , (60, "bíwɔɔrɔ")
-      , (61, "bíwɔɔrɔ ní kélen")
-      , (62, "bíwɔɔrɔ ní fila")
-      , (63, "bíwɔɔrɔ ní sàba")
-      , (64, "bíwɔɔrɔ ní náani")
-      , (65, "bíwɔɔrɔ ní dúuru")
-      , (66, "bíwɔɔrɔ ní wɔɔrɔ")
-      , (67, "bíwɔɔrɔ ní wólonwula")
-      , (68, "bíwɔɔrɔ ní séegin")
-      , (69, "bíwɔɔrɔ ní k̀ɔnɔntɔn")
-      , (70, "bíwolonfila")
-      , (71, "bíwolonfila ní kélen")
-      , (72, "bíwolonfila ní fila")
-      , (73, "bíwolonfila ní sàba")
-      , (74, "bíwolonfila ní náani")
-      , (75, "bíwolonfila ní dúuru")
-      , (76, "bíwolonfila ní wɔɔrɔ")
-      , (77, "bíwolonfila ní wólonwula")
-      , (78, "bíwolonfila ní séegin")
-      , (79, "bíwolonfila ní k̀ɔnɔntɔn")
-      , (80, "bíséegin")
-      , (81, "bíséegin ní kélen")
-      , (82, "bíséegin ní fila")
-      , (83, "bíséegin ní sàba")
-      , (84, "bíséegin ní náani")
-      , (85, "bíséegin ní dúuru")
-      , (86, "bíséegin ní wɔɔrɔ")
-      , (87, "bíséegin ní wólonwula")
-      , (88, "bíséegin ní séegin")
-      , (89, "bíséegin ní k̀ɔnɔntɔn")
-      , (90, "bík̀ɔnɔntɔn")
-      , (91, "bík̀ɔnɔntɔn ní kélen")
-      , (92, "bík̀ɔnɔntɔn ní fila")
-      , (93, "bík̀ɔnɔntɔn ní sàba")
-      , (94, "bík̀ɔnɔntɔn ní náani")
-      , (95, "bík̀ɔnɔntɔn ní dúuru")
-      , (96, "bík̀ɔnɔntɔn ní wɔɔrɔ")
-      , (97, "bík̀ɔnɔntɔn ní wólonwula")
-      , (98, "bík̀ɔnɔntɔn ní séegin")
-      , (99, "bík̀ɔnɔntɔn ní k̀ɔnɔntɔn")
-      , (100, "k̀ɛmɛ")
-      , (101, "k̀ɛmɛ ní kélen")
-      , (102, "k̀ɛmɛ ní fila")
-      , (103, "k̀ɛmɛ ní sàba")
-      , (104, "k̀ɛmɛ ní náani")
-      , (105, "k̀ɛmɛ ní dúuru")
-      , (106, "k̀ɛmɛ ní wɔɔrɔ")
-      , (107, "k̀ɛmɛ ní wólonwula")
-      , (108, "k̀ɛmɛ ní séegin")
-      , (109, "k̀ɛmɛ ní k̀ɔnɔntɔn")
-      , (110, "k̀ɛmɛ ní tán")
-      , (123, "k̀ɛmɛ ní mùgan ní sàba")
-      , (200, "k̀ɛmɛ fila")
-      , (300, "k̀ɛmɛ sàba")
-      , (321, "k̀ɛmɛ sàba ní mùgan ní kélen")
-      , (400, "k̀ɛmɛ náani")
-      , (500, "k̀ɛmɛ dúuru")
-      , (600, "k̀ɛmɛ wɔɔrɔ")
-      , (700, "wólonwula k̀ɛmɛ")
-      , (800, "séegin k̀ɛmɛ")
-      , (900, "k̀ɔnɔntɔn k̀ɛmɛ")
-      , (909, "k̀ɔnɔntɔn k̀ɛmɛ ní k̀ɔnɔntɔn")
-      , (990, "k̀ɔnɔntɔn k̀ɛmɛ ní bík̀ɔnɔntɔn")
-      , (999, "k̀ɔnɔntɔn k̀ɛmɛ ní bík̀ɔnɔntɔn ní k̀ɔnɔntɔn")
-      , (1000, "wa kélen")
-      , (1001, "wa kélen ní kélen")
-      , (1008, "wa kélen ní séegin")
-      , (1234, "wa kélen ní k̀ɛmɛ fila ní bísàba ní náani")
-      , (2000, "wa fila")
-      , (3000, "wa sàba")
-      , (4000, "wa náani")
-      , (4321, "wa náani ní k̀ɛmɛ sàba ní mùgan ní kélen")
-      , (5000, "wa dúuru")
-      , (6000, "wa wɔɔrɔ")
-      , (7000, "wólonwula wa")
-      , (8000, "séegin wa")
-      , (9000, "k̀ɔnɔntɔn wa")
-      , (10000, "tán wa")
-      , (12345, "tán ní wa fila ní k̀ɛmɛ sàba ní bínaani ní dúuru")
-      , (20000, "mùgan wa")
-      , (30000, "bíwa sàba")
-      , (40000, "bínaani wa")
-      , (50000, "bíwa dúuru")
-      , (54321, "bídúuru ní wa náani ní k̀ɛmɛ sàba ní mùgan ní kélen")
-      , (60000, "bíwa wɔɔrɔ")
-      , (70000, "bíwa wolonfila")
-      , (80000, "bíséegin wa")
-      , (90000, "bík̀ɔnɔntɔn wa")
-      , (100000, "k̀ɛmɛ wa")
-      , (123456, "k̀ɛmɛ ní mùgan ní wa sàba ní k̀ɛmɛ náani ní bídúuru ní wɔɔrɔ")
-      , (200000, "k̀ɛmɛ fila wa")
-      , (300000, "k̀ɛmɛ sàba wa")
-      , (400000, "k̀ɛmɛ náani wa")
-      , (500000, "k̀ɛmɛ dúuru wa")
-      , (600000, "k̀ɛmɛ wɔɔrɔ wa")
-      , (654321, "k̀ɛmɛ wɔɔrɔ ní bídúuru ní wa náani ní k̀ɛmɛ sàba ní mùgan ní kélen")
-      , (700000, "wólonwula k̀ɛmɛ wa")
-      , (800000, "séegin k̀ɛmɛ wa")
-      , (900000, "k̀ɔnɔntɔn k̀ɛmɛ wa")
-      , (1000000, "mílyɔn kélen")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/BUL/TestData.hs b/src-test/Text/Numeral/Language/BUL/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/BUL/TestData.hs
@@ -0,0 +1,228 @@
+{-|
+[@ISO639-1@]        bg
+
+[@ISO639-2@]        bul
+
+[@ISO639-3@]        bul
+
+[@Native name@]     български език
+
+[@English name@]    Bulgarian
+-}
+
+module Text.Numeral.Language.BUL.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-bulgarian/en/bul/
+  http://en.wikipedia.org/wiki/Bulgarian_grammar#Numbers
+  http://bg.wikipedia.org/wiki/Имена_на_числата
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "neuter"
+    , neuter defaultInflection
+    , [ (-3, "минус три")
+      , (0, "нула")
+      , (1, "едно")
+      , (2, "две")
+      , (3, "три")
+      , (4, "четири")
+      , (5, "пет")
+      , (6, "шест")
+      , (7, "седем")
+      , (8, "осем")
+      , (9, "девет")
+      , (10, "десет")
+      , (11, "единадесет")
+      , (12, "дванадесет")
+      , (13, "тринадесет")
+      , (14, "четиринадесет")
+      , (15, "петнадесет")
+      , (16, "шестнадесет")
+      , (17, "седемнадесет")
+      , (18, "осемнадесет")
+      , (19, "деветнадесет")
+      , (20, "двадесет")
+      , (21, "двадесет и едно")
+      , (22, "двадесет и две")
+      , (23, "двадесет и три")
+      , (24, "двадесет и четири")
+      , (25, "двадесет и пет")
+      , (26, "двадесет и шест")
+      , (27, "двадесет и седем")
+      , (28, "двадесет и осем")
+      , (29, "двадесет и девет")
+      , (30, "тридесет")
+      , (31, "тридесет и едно")
+      , (32, "тридесет и две")
+      , (33, "тридесет и три")
+      , (34, "тридесет и четири")
+      , (35, "тридесет и пет")
+      , (36, "тридесет и шест")
+      , (37, "тридесет и седем")
+      , (38, "тридесет и осем")
+      , (39, "тридесет и девет")
+      , (40, "четиридесет")
+      , (41, "четиридесет и едно")
+      , (42, "четиридесет и две")
+      , (43, "четиридесет и три")
+      , (44, "четиридесет и четири")
+      , (45, "четиридесет и пет")
+      , (46, "четиридесет и шест")
+      , (47, "четиридесет и седем")
+      , (48, "четиридесет и осем")
+      , (49, "четиридесет и девет")
+      , (50, "петдесет")
+      , (51, "петдесет и едно")
+      , (52, "петдесет и две")
+      , (53, "петдесет и три")
+      , (54, "петдесет и четири")
+      , (55, "петдесет и пет")
+      , (56, "петдесет и шест")
+      , (57, "петдесет и седем")
+      , (58, "петдесет и осем")
+      , (59, "петдесет и девет")
+      , (60, "шестдесет")
+      , (61, "шестдесет и едно")
+      , (62, "шестдесет и две")
+      , (63, "шестдесет и три")
+      , (64, "шестдесет и четири")
+      , (65, "шестдесет и пет")
+      , (66, "шестдесет и шест")
+      , (67, "шестдесет и седем")
+      , (68, "шестдесет и осем")
+      , (69, "шестдесет и девет")
+      , (70, "седемдесет")
+      , (71, "седемдесет и едно")
+      , (72, "седемдесет и две")
+      , (73, "седемдесет и три")
+      , (74, "седемдесет и четири")
+      , (75, "седемдесет и пет")
+      , (76, "седемдесет и шест")
+      , (77, "седемдесет и седем")
+      , (78, "седемдесет и осем")
+      , (79, "седемдесет и девет")
+      , (80, "осемдесет")
+      , (81, "осемдесет и едно")
+      , (82, "осемдесет и две")
+      , (83, "осемдесет и три")
+      , (84, "осемдесет и четири")
+      , (85, "осемдесет и пет")
+      , (86, "осемдесет и шест")
+      , (87, "осемдесет и седем")
+      , (88, "осемдесет и осем")
+      , (89, "осемдесет и девет")
+      , (90, "деветдесет")
+      , (91, "деветдесет и едно")
+      , (92, "деветдесет и две")
+      , (93, "деветдесет и три")
+      , (94, "деветдесет и четири")
+      , (95, "деветдесет и пет")
+      , (96, "деветдесет и шест")
+      , (97, "деветдесет и седем")
+      , (98, "деветдесет и осем")
+      , (99, "деветдесет и девет")
+      , (100, "сто")
+      , (101, "сто и едно")
+      , (102, "сто и две")
+      , (110, "сто и десет")
+      , (115, "сто и петнадесет")
+      , (120, "сто и двадесет")
+      , (121, "сто двадесет и едно")
+      , (130, "сто и тридесет")
+      , (133, "сто тридесет и три")
+      , (200, "двеста")
+      , (202, "двеста и две")
+      , (216, "двеста и шестнадесет")
+      , (265, "двеста шестдесет и пет")
+      , (300, "триста")
+      , (400, "четиристотин")
+      , (500, "петстотин")
+      , (507, "петстотин и седем")
+      , (600, "шестстотин")
+      , (700, "седемстотин")
+      , (800, "осемстотин")
+      , (900, "деветстотин")
+      , (1000, "хиляда")
+      , (1234, "хиляда двеста тридесет и четири")
+      , (2000, "две хиляди")
+      , (3000, "три хиляди")
+      , (5000, "пет хиляди")
+      , (6000, "шест хиляди")
+      , (9000, "девет хиляди")
+      , (16000, "шестнадесет хиляди")
+      , (21000, "двадесет и едно хиляди")
+      , (22000, "двадесет и две хиляди")
+      , (22136, "двадесет и две хиляди сто тридесет и шест")
+      , (23000, "двадесет и три хиляди")
+      , (28000, "двадесет и осем хиляди")
+      , (41000, "четиридесет и едно хиляди")
+      , (42000, "четиридесет и две хиляди")
+      , (49000, "четиридесет и девет хиляди")
+      , (100000, "сто хиляди")
+      , (200000, "двеста хиляди")
+      , (255383, "двеста петдесет и пет хиляди триста осемдесет и три")
+      , (300000, "триста хиляди")
+      , (300001, "триста хиляди и едно")
+      , (300020, "триста хиляди и двадесет")
+      , (300825, "триста хиляди осемстотин двадесет и пет")
+      , (dec 6, "един милион")
+      , (1300825, "един милион триста хиляди осемстотин двадесет и пет")
+      , (1021000, "един милион двадесет и едно хиляди")
+      , (1001234, "един милион хиляда двеста тридесет и четири")
+      , (1000216, "един милион двеста и шестнадесет")
+      , (1000074, "един милион седемдесет и четири")
+      , (1000004, "един милион и четири")
+      , (2 * dec 6, "два милиона")
+      , (5 * dec 6, "пет милиона")
+      , (dec 9, "един милиард")
+      , (2 * dec 9, "два милиарда")
+      , (3 * dec 12, "три трилиона")
+      , (dec 15, "един квадрилион")
+      , (15 * dec 15 + 41, "петнадесет квадрилиона четиридесет и едно")
+      , (dec 18, "един квинтилион")
+      , (dec 21, "един секстилион")
+      , (dec 24, "един септилион")
+      , (dec 27, "един октилион")
+      , (dec 30, "един нонилион")
+      , (dec 33, "един децилион")
+      , (dec 36, "един индецилион")
+      , (dec 39, "един дуодецилион")
+      , (dec 42, "един тридецилион")
+      , (dec 45, "един куадродецилион")
+      , (900 * dec 45, "деветстотин куадродецилиона")
+      ]
+    )
+    , ( "feminine"
+      , feminine defaultInflection
+      , [ (1, "една")
+        , (2, "две")
+        , (200, "двеста")
+        , (202, "двеста и две")
+        ]
+      )
+    , ( "masculine"
+      , masculine defaultInflection
+      , [ (1, "един")
+        , (2, "два")
+        , (200, "двеста")
+        , (202, "двеста и два")
+        ]
+      )
+  ]
diff --git a/src-test/Text/Numeral/Language/CA/TestData.hs b/src-test/Text/Numeral/Language/CA/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/CA/TestData.hs
+++ /dev/null
@@ -1,217 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        ca
-
-[@ISO639-2@]        cat
-
-[@ISO639-3@]        cat
-
-[@Native name@]     català
-
-[@English name@]    Catalan
--}
-module Text.Numeral.Language.CA.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-catalan/en/cat/
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "zero")
-      , (1, "un")
-      , (2, "dos")
-      , (3, "tres")
-      , (4, "quatre")
-      , (5, "cinc")
-      , (6, "sis")
-      , (7, "set")
-      , (8, "vuit")
-      , (9, "nou")
-      , (10, "deu")
-      , (11, "onze")
-      , (12, "dotze")
-      , (13, "tretze")
-      , (14, "catorze")
-      , (15, "quinze")
-      , (16, "setze")
-      , (17, "disset")
-      , (18, "divuit")
-      , (19, "dinou")
-      , (20, "vint")
-      , (21, "vint-i-u")
-      , (22, "vint-i-dos")
-      , (23, "vint-i-tres")
-      , (24, "vint-i-quatre")
-      , (25, "vint-i-cinc")
-      , (26, "vint-i-sis")
-      , (27, "vint-i-set")
-      , (28, "vint-i-vuit")
-      , (29, "vint-i-nou")
-      , (30, "trenta")
-      , (31, "trenta-u")
-      , (32, "trenta-dos")
-      , (33, "trenta-tres")
-      , (34, "trenta-quatre")
-      , (35, "trenta-cinc")
-      , (36, "trenta-sis")
-      , (37, "trenta-set")
-      , (38, "trenta-vuit")
-      , (39, "trenta-nou")
-      , (40, "quaranta")
-      , (41, "quaranta-u")
-      , (42, "quaranta-dos")
-      , (43, "quaranta-tres")
-      , (44, "quaranta-quatre")
-      , (45, "quaranta-cinc")
-      , (46, "quaranta-sis")
-      , (47, "quaranta-set")
-      , (48, "quaranta-vuit")
-      , (49, "quaranta-nou")
-      , (50, "cinquanta")
-      , (51, "cinquanta-u")
-      , (52, "cinquanta-dos")
-      , (53, "cinquanta-tres")
-      , (54, "cinquanta-quatre")
-      , (55, "cinquanta-cinc")
-      , (56, "cinquanta-sis")
-      , (57, "cinquanta-set")
-      , (58, "cinquanta-vuit")
-      , (59, "cinquanta-nou")
-      , (60, "seixanta")
-      , (61, "seixanta-u")
-      , (62, "seixanta-dos")
-      , (63, "seixanta-tres")
-      , (64, "seixanta-quatre")
-      , (65, "seixanta-cinc")
-      , (66, "seixanta-sis")
-      , (67, "seixanta-set")
-      , (68, "seixanta-vuit")
-      , (69, "seixanta-nou")
-      , (70, "setanta")
-      , (71, "setanta-u")
-      , (72, "setanta-dos")
-      , (73, "setanta-tres")
-      , (74, "setanta-quatre")
-      , (75, "setanta-cinc")
-      , (76, "setanta-sis")
-      , (77, "setanta-set")
-      , (78, "setanta-vuit")
-      , (79, "setanta-nou")
-      , (80, "vuitanta")
-      , (81, "vuitanta-u")
-      , (82, "vuitanta-dos")
-      , (83, "vuitanta-tres")
-      , (84, "vuitanta-quatre")
-      , (85, "vuitanta-cinc")
-      , (86, "vuitanta-sis")
-      , (87, "vuitanta-set")
-      , (88, "vuitanta-vuit")
-      , (89, "vuitanta-nou")
-      , (90, "noranta")
-      , (91, "noranta-u")
-      , (92, "noranta-dos")
-      , (93, "noranta-tres")
-      , (94, "noranta-quatre")
-      , (95, "noranta-cinc")
-      , (96, "noranta-sis")
-      , (97, "noranta-set")
-      , (98, "noranta-vuit")
-      , (99, "noranta-nou")
-      , (100, "cent")
-      , (101, "cent un")
-      , (102, "cent dos")
-      , (103, "cent tres")
-      , (104, "cent quatre")
-      , (105, "cent cinc")
-      , (106, "cent sis")
-      , (107, "cent set")
-      , (108, "cent vuit")
-      , (109, "cent nou")
-      , (110, "cent deu")
-      , (123, "cent vint-i-tres")
-      , (200, "dos-cents")
-      , (300, "tres-cents")
-      , (321, "tres-cents vint-i-u")
-      , (400, "quatre-cents")
-      , (500, "cinc-cents")
-      , (600, "sis-cents")
-      , (700, "set-cents")
-      , (800, "vuit-cents")
-      , (900, "nou-cents")
-      , (909, "nou-cents nou")
-      , (990, "nou-cents noranta")
-      , (999, "nou-cents noranta-nou")
-      , (1000, "mil")
-      , (1001, "mil un")
-      , (1008, "mil vuit")
-      , (1234, "mil dos-cents trenta-quatre")
-      , (2000, "dos mil")
-      , (3000, "tres mil")
-      , (4000, "quatre mil")
-      , (4321, "quatre mil tres-cents vint-i-u")
-      , (5000, "cinc mil")
-      , (6000, "sis mil")
-      , (7000, "set mil")
-      , (8000, "vuit mil")
-      , (9000, "nou mil")
-      , (10000, "deu mil")
-      , (12345, "dotze mil tres-cents quaranta-cinc")
-      , (20000, "vint mil")
-      , (30000, "trenta mil")
-      , (40000, "quaranta mil")
-      , (50000, "cinquanta mil")
-      , (54321, "cinquanta-quatre mil tres-cents vint-i-u")
-      , (60000, "seixanta mil")
-      , (70000, "setanta mil")
-      , (80000, "vuitanta mil")
-      , (90000, "noranta mil")
-      , (100000, "cent mil")
-      , (123456, "cent vint-i-tres mil quatre-cents cinquanta-sis")
-      , (200000, "dos-cents mil")
-      , (300000, "tres-cents mil")
-      , (400000, "quatre-cents mil")
-      , (500000, "cinc-cents mil")
-      , (600000, "sis-cents mil")
-      , (654321, "sis-cents cinquanta-quatre mil tres-cents vint-i-u")
-      , (700000, "set-cents mil")
-      , (800000, "vuit-cents mil")
-      , (900000, "nou-cents mil")
-      , (1000000, "un milió")
-      , (1234567, "un milió dos-cents trenta-quatre mil cinc-cents seixanta-set")
-      , (7654321, "set milions sis-cents cinquanta-quatre mil tres-cents vint-i-u")
-      , (1000000000, "mil milions")
-      , (1000000000000, "un bilió")
-      , (1000000000000000000, "un trilió")
-      , (1000000000000000000000, "un triliard")
-      , (1000000000000000000000000, "un quadrilió")
-      , (1000000000000000000000000000, "un quadriliard")
-      , (1000000000000000000000000000000, "un quintilió")
-      , (1000000000000000000000000000000000, "un quintiliard")
-      , (1000000000000000000000000000000000000, "un sextilió")
-      , (1000000000000000000000000000000000000000, "un sextiliard")
-      , (1000000000000000000000000000000000000000000, "un septilió")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/CAF/TestData.hs b/src-test/Text/Numeral/Language/CAF/TestData.hs
--- a/src-test/Text/Numeral/Language/CAF/TestData.hs
+++ b/src-test/Text/Numeral/Language/CAF/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -24,8 +19,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -38,7 +32,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-carrier/en/caf/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
@@ -147,7 +141,7 @@
   ]
 
 -- Using Carrier sylllabics
-syllabic_cardinals ∷ (Num i) ⇒ TestData i
+syllabic_cardinals :: (Num i) => TestData i
 syllabic_cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/CAR/TestData.hs b/src-test/Text/Numeral/Language/CAR/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/CAR/TestData.hs
@@ -0,0 +1,152 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        car
+
+[@ISO639-3@]        car
+
+[@Native name@]     -
+
+[@English name@]    Carib
+-}
+module Text.Numeral.Language.CAR.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-kalina/en/car/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "òwin")
+      , (2, "oko")
+      , (3, "oruwa")
+      , (4, "okupàen")
+      , (5, "ainatone")
+      , (6, "òwin-tòima")
+      , (7, "oko-tòima")
+      , (8, "oruwa-tòima")
+      , (9, "okupàen-tòima")
+      , (10, "ainapatoro")
+      , (11, "ainapatoro itùponaka òwin")
+      , (12, "ainapatoro itùponaka oko")
+      , (13, "ainapatoro itùponaka oruwa")
+      , (14, "ainapatoro itùponaka okupàen")
+      , (15, "atonèpu")
+      , (16, "ainapatoro itùponaka òwin-tòima")
+      , (17, "ainapatoro itùponaka oko-tòima")
+      , (18, "ainapatoro itùponaka oruwa-tòima")
+      , (19, "ainapatoro itùponaka okupàen-tòima")
+      , (20, "òwin-karìna")
+      , (21, "òwin-karìna itùponaka òwin")
+      , (22, "òwin-karìna itùponaka oko")
+      , (23, "òwin-karìna itùponaka oruwa")
+      , (24, "òwin-karìna itùponaka okupàen")
+      , (25, "òwin-karìna itùponaka ainatone")
+      , (26, "òwin-karìna itùponaka òwin-tòima")
+      , (27, "òwin-karìna itùponaka oko-tòima")
+      , (28, "òwin-karìna itùponaka oruwa-tòima")
+      , (29, "òwin-karìna itùponaka okupàen-tòima")
+      , (30, "òwin-karìna itùponaka ainapatoro")
+      , (31, "òwin-karìna itùponaka ainapatoro itùponaka òwin")
+      , (32, "òwin-karìna itùponaka ainapatoro itùponaka oko")
+      , (33, "òwin-karìna itùponaka ainapatoro itùponaka oruwa")
+      , (34, "òwin-karìna itùponaka ainapatoro itùponaka okupàen")
+      , (35, "òwin-karìna itùponaka atonèpu")
+      , (36, "òwin-karìna itùponaka ainapatoro itùponaka òwin-tòima")
+      , (37, "òwin-karìna itùponaka ainapatoro itùponaka oko-tòima")
+      , (38, "òwin-karìna itùponaka ainapatoro itùponaka oruwa-tòima")
+      , (39, "òwin-karìna itùponaka ainapatoro itùponaka okupàen-tòima")
+      , (40, "oko-karìna")
+      , (41, "oko-karìna itùponaka òwin")
+      , (42, "oko-karìna itùponaka oko")
+      , (43, "oko-karìna itùponaka oruwa")
+      , (44, "oko-karìna itùponaka okupàen")
+      , (45, "oko-karìna itùponaka ainatone")
+      , (46, "oko-karìna itùponaka òwin-tòima")
+      , (47, "oko-karìna itùponaka oko-tòima")
+      , (48, "oko-karìna itùponaka oruwa-tòima")
+      , (49, "oko-karìna itùponaka okupàen-tòima")
+      , (50, "oko-karìna itùponaka ainapatoro")
+      , (51, "oko-karìna itùponaka ainapatoro itùponaka òwin")
+      , (52, "oko-karìna itùponaka ainapatoro itùponaka oko")
+      , (53, "oko-karìna itùponaka ainapatoro itùponaka oruwa")
+      , (54, "oko-karìna itùponaka ainapatoro itùponaka okupàen")
+      , (55, "oko-karìna itùponaka atonèpu")
+      , (56, "oko-karìna itùponaka ainapatoro itùponaka òwin-tòima")
+      , (57, "oko-karìna itùponaka ainapatoro itùponaka oko-tòima")
+      , (58, "oko-karìna itùponaka ainapatoro itùponaka oruwa-tòima")
+      , (59, "oko-karìna itùponaka ainapatoro itùponaka okupàen-tòima")
+      , (60, "oruwa-karìna")
+      , (61, "oruwa-karìna itùponaka òwin")
+      , (62, "oruwa-karìna itùponaka oko")
+      , (63, "oruwa-karìna itùponaka oruwa")
+      , (64, "oruwa-karìna itùponaka okupàen")
+      , (65, "oruwa-karìna itùponaka ainatone")
+      , (66, "oruwa-karìna itùponaka òwin-tòima")
+      , (67, "oruwa-karìna itùponaka oko-tòima")
+      , (68, "oruwa-karìna itùponaka oruwa-tòima")
+      , (69, "oruwa-karìna itùponaka okupàen-tòima")
+      , (70, "oruwa-karìna itùponaka ainapatoro")
+      , (71, "oruwa-karìna itùponaka ainapatoro itùponaka òwin")
+      , (72, "oruwa-karìna itùponaka ainapatoro itùponaka oko")
+      , (73, "oruwa-karìna itùponaka ainapatoro itùponaka oruwa")
+      , (74, "oruwa-karìna itùponaka ainapatoro itùponaka okupàen")
+      , (75, "oruwa-karìna itùponaka atonèpu")
+      , (76, "oruwa-karìna itùponaka ainapatoro itùponaka òwin-tòima")
+      , (77, "oruwa-karìna itùponaka ainapatoro itùponaka oko-tòima")
+      , (78, "oruwa-karìna itùponaka ainapatoro itùponaka oruwa-tòima")
+      , (79, "oruwa-karìna itùponaka ainapatoro itùponaka okupàen-tòima")
+      , (80, "okupàen-karìna")
+      , (81, "okupàen-karìna itùponaka òwin")
+      , (82, "okupàen-karìna itùponaka oko")
+      , (83, "okupàen-karìna itùponaka oruwa")
+      , (84, "okupàen-karìna itùponaka okupàen")
+      , (85, "okupàen-karìna itùponaka ainatone")
+      , (86, "okupàen-karìna itùponaka òwin-tòima")
+      , (87, "okupàen-karìna itùponaka oko-tòima")
+      , (88, "okupàen-karìna itùponaka oruwa-tòima")
+      , (89, "okupàen-karìna itùponaka okupàen-tòima")
+      , (90, "okupàen-karìna itùponaka ainapatoro")
+      , (91, "okupàen-karìna itùponaka ainapatoro itùponaka òwin")
+      , (92, "okupàen-karìna itùponaka ainapatoro itùponaka oko")
+      , (93, "okupàen-karìna itùponaka ainapatoro itùponaka oruwa")
+      , (94, "okupàen-karìna itùponaka ainapatoro itùponaka okupàen")
+      , (95, "okupàen-karìna itùponaka atonèpu")
+      , (96, "okupàen-karìna itùponaka ainapatoro itùponaka òwin-tòima")
+      , (97, "okupàen-karìna itùponaka ainapatoro itùponaka oko-tòima")
+      , (98, "okupàen-karìna itùponaka ainapatoro itùponaka oruwa-tòima")
+      , (99, "okupàen-karìna itùponaka ainapatoro itùponaka okupàen-tòima")
+      , (100, "ainatone-karìna")
+      , (101, "ainatone-karìna itùponaka òwin")
+      , (102, "ainatone-karìna itùponaka oko")
+      , (103, "ainatone-karìna itùponaka oruwa")
+      , (104, "ainatone-karìna itùponaka okupàen")
+      , (105, "ainatone-karìna itùponaka ainatone")
+      , (106, "ainatone-karìna itùponaka òwin-tòima")
+      , (107, "ainatone-karìna itùponaka oko-tòima")
+      , (108, "ainatone-karìna itùponaka oruwa-tòima")
+      , (109, "ainatone-karìna itùponaka okupàen-tòima")
+      , (110, "ainatone-karìna itùponaka ainapatoro")
+      , (123, "òwin-tòima-karìna itùponaka oruwa")
+      , (200, "ainapatoro-karìna")
+      , (300, "atonèpu-karìna")
+      , (321, "atonèpu-itùponaka-òwin-karìna itùponaka òwin")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/CAT/TestData.hs b/src-test/Text/Numeral/Language/CAT/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/CAT/TestData.hs
@@ -0,0 +1,211 @@
+{-|
+[@ISO639-1@]        ca
+
+[@ISO639-2@]        cat
+
+[@ISO639-3@]        cat
+
+[@Native name@]     català
+
+[@English name@]    Catalan
+-}
+module Text.Numeral.Language.CAT.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-catalan/en/cat/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "zero")
+      , (1, "un")
+      , (2, "dos")
+      , (3, "tres")
+      , (4, "quatre")
+      , (5, "cinc")
+      , (6, "sis")
+      , (7, "set")
+      , (8, "vuit")
+      , (9, "nou")
+      , (10, "deu")
+      , (11, "onze")
+      , (12, "dotze")
+      , (13, "tretze")
+      , (14, "catorze")
+      , (15, "quinze")
+      , (16, "setze")
+      , (17, "disset")
+      , (18, "divuit")
+      , (19, "dinou")
+      , (20, "vint")
+      , (21, "vint-i-u")
+      , (22, "vint-i-dos")
+      , (23, "vint-i-tres")
+      , (24, "vint-i-quatre")
+      , (25, "vint-i-cinc")
+      , (26, "vint-i-sis")
+      , (27, "vint-i-set")
+      , (28, "vint-i-vuit")
+      , (29, "vint-i-nou")
+      , (30, "trenta")
+      , (31, "trenta-u")
+      , (32, "trenta-dos")
+      , (33, "trenta-tres")
+      , (34, "trenta-quatre")
+      , (35, "trenta-cinc")
+      , (36, "trenta-sis")
+      , (37, "trenta-set")
+      , (38, "trenta-vuit")
+      , (39, "trenta-nou")
+      , (40, "quaranta")
+      , (41, "quaranta-u")
+      , (42, "quaranta-dos")
+      , (43, "quaranta-tres")
+      , (44, "quaranta-quatre")
+      , (45, "quaranta-cinc")
+      , (46, "quaranta-sis")
+      , (47, "quaranta-set")
+      , (48, "quaranta-vuit")
+      , (49, "quaranta-nou")
+      , (50, "cinquanta")
+      , (51, "cinquanta-u")
+      , (52, "cinquanta-dos")
+      , (53, "cinquanta-tres")
+      , (54, "cinquanta-quatre")
+      , (55, "cinquanta-cinc")
+      , (56, "cinquanta-sis")
+      , (57, "cinquanta-set")
+      , (58, "cinquanta-vuit")
+      , (59, "cinquanta-nou")
+      , (60, "seixanta")
+      , (61, "seixanta-u")
+      , (62, "seixanta-dos")
+      , (63, "seixanta-tres")
+      , (64, "seixanta-quatre")
+      , (65, "seixanta-cinc")
+      , (66, "seixanta-sis")
+      , (67, "seixanta-set")
+      , (68, "seixanta-vuit")
+      , (69, "seixanta-nou")
+      , (70, "setanta")
+      , (71, "setanta-u")
+      , (72, "setanta-dos")
+      , (73, "setanta-tres")
+      , (74, "setanta-quatre")
+      , (75, "setanta-cinc")
+      , (76, "setanta-sis")
+      , (77, "setanta-set")
+      , (78, "setanta-vuit")
+      , (79, "setanta-nou")
+      , (80, "vuitanta")
+      , (81, "vuitanta-u")
+      , (82, "vuitanta-dos")
+      , (83, "vuitanta-tres")
+      , (84, "vuitanta-quatre")
+      , (85, "vuitanta-cinc")
+      , (86, "vuitanta-sis")
+      , (87, "vuitanta-set")
+      , (88, "vuitanta-vuit")
+      , (89, "vuitanta-nou")
+      , (90, "noranta")
+      , (91, "noranta-u")
+      , (92, "noranta-dos")
+      , (93, "noranta-tres")
+      , (94, "noranta-quatre")
+      , (95, "noranta-cinc")
+      , (96, "noranta-sis")
+      , (97, "noranta-set")
+      , (98, "noranta-vuit")
+      , (99, "noranta-nou")
+      , (100, "cent")
+      , (101, "cent un")
+      , (102, "cent dos")
+      , (103, "cent tres")
+      , (104, "cent quatre")
+      , (105, "cent cinc")
+      , (106, "cent sis")
+      , (107, "cent set")
+      , (108, "cent vuit")
+      , (109, "cent nou")
+      , (110, "cent deu")
+      , (123, "cent vint-i-tres")
+      , (200, "dos-cents")
+      , (300, "tres-cents")
+      , (321, "tres-cents vint-i-u")
+      , (400, "quatre-cents")
+      , (500, "cinc-cents")
+      , (600, "sis-cents")
+      , (700, "set-cents")
+      , (800, "vuit-cents")
+      , (900, "nou-cents")
+      , (909, "nou-cents nou")
+      , (990, "nou-cents noranta")
+      , (999, "nou-cents noranta-nou")
+      , (1000, "mil")
+      , (1001, "mil un")
+      , (1008, "mil vuit")
+      , (1234, "mil dos-cents trenta-quatre")
+      , (2000, "dos mil")
+      , (3000, "tres mil")
+      , (4000, "quatre mil")
+      , (4321, "quatre mil tres-cents vint-i-u")
+      , (5000, "cinc mil")
+      , (6000, "sis mil")
+      , (7000, "set mil")
+      , (8000, "vuit mil")
+      , (9000, "nou mil")
+      , (10000, "deu mil")
+      , (12345, "dotze mil tres-cents quaranta-cinc")
+      , (20000, "vint mil")
+      , (30000, "trenta mil")
+      , (40000, "quaranta mil")
+      , (50000, "cinquanta mil")
+      , (54321, "cinquanta-quatre mil tres-cents vint-i-u")
+      , (60000, "seixanta mil")
+      , (70000, "setanta mil")
+      , (80000, "vuitanta mil")
+      , (90000, "noranta mil")
+      , (100000, "cent mil")
+      , (123456, "cent vint-i-tres mil quatre-cents cinquanta-sis")
+      , (200000, "dos-cents mil")
+      , (300000, "tres-cents mil")
+      , (400000, "quatre-cents mil")
+      , (500000, "cinc-cents mil")
+      , (600000, "sis-cents mil")
+      , (654321, "sis-cents cinquanta-quatre mil tres-cents vint-i-u")
+      , (700000, "set-cents mil")
+      , (800000, "vuit-cents mil")
+      , (900000, "nou-cents mil")
+      , (1000000, "un milió")
+      , (1234567, "un milió dos-cents trenta-quatre mil cinc-cents seixanta-set")
+      , (7654321, "set milions sis-cents cinquanta-quatre mil tres-cents vint-i-u")
+      , (1000000000, "mil milions")
+      , (1000000000000, "un bilió")
+      , (1000000000000000000, "un trilió")
+      , (1000000000000000000000, "un triliard")
+      , (1000000000000000000000000, "un quadrilió")
+      , (1000000000000000000000000000, "un quadriliard")
+      , (1000000000000000000000000000000, "un quintilió")
+      , (1000000000000000000000000000000000, "un quintiliard")
+      , (1000000000000000000000000000000000000, "un sextilió")
+      , (1000000000000000000000000000000000000000, "un sextiliard")
+      , (1000000000000000000000000000000000000000000, "un septilió")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/CBK/TestData.hs b/src-test/Text/Numeral/Language/CBK/TestData.hs
--- a/src-test/Text/Numeral/Language/CBK/TestData.hs
+++ b/src-test/Text/Numeral/Language/CBK/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-chavacano/en/cbk/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/CES/TestData.hs b/src-test/Text/Numeral/Language/CES/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/CES/TestData.hs
@@ -0,0 +1,204 @@
+{-|
+[@ISO639-1@]        cs
+
+[@ISO639-2B@]       cze
+
+[@ISO639-2T@]       ces
+
+[@ISO639-3@]        ces
+
+[@Native name@]     Čeština
+
+[@English name@]    Czech
+-}
+
+module Text.Numeral.Language.CES.TestData (cardinals, ordinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "nula")
+      , (1, "jeden")
+      , (2, "dva")
+      , (3, "tři")
+      , (4, "čtyři")
+      , (5, "pět")
+      , (6, "šest")
+      , (7, "sedm")
+      , (8, "osm")
+      , (9, "devět")
+      , (10, "deset")
+      , (11, "jedenáct")
+      , (12, "dvanáct")
+      , (13, "třináct")
+      , (14, "ctrnáct")
+      , (15, "patnáct")
+      , (16, "šestnáct")
+      , (17, "sedmnáct")
+      , (18, "osmnáct")
+      , (19, "devatenáct")
+      , (20, "dvacet")
+      , (21, "dvacet jedna")
+      , (22, "dvacet dva")
+      , (23, "dvacet tři")
+      , (24, "dvacet čtyři")
+      , (25, "dvacet pět")
+      , (26, "dvacet šest")
+      , (27, "dvacet sedm")
+      , (28, "dvacet osm")
+      , (29, "dvacet devět")
+      , (30, "třicet")
+      , (31, "třicet jedna")
+      , (32, "třicet dva")
+      , (33, "třicet tři")
+      , (34, "třicet čtyři")
+      , (35, "třicet pět")
+      , (36, "třicet šest")
+      , (37, "třicet sedm")
+      , (38, "třicet osm")
+      , (39, "třicet devět")
+      , (40, "čtyřicet")
+      , (41, "čtyřicet jedna")
+      , (42, "čtyřicet dva")
+      , (43, "čtyřicet tři")
+      , (44, "čtyřicet čtyři")
+      , (45, "čtyřicet pět")
+      , (46, "čtyřicet šest")
+      , (47, "čtyřicet sedm")
+      , (48, "čtyřicet osm")
+      , (49, "čtyřicet devět")
+      , (50, "padesát")
+      , (51, "padesát jedna")
+      , (52, "padesát dva")
+      , (53, "padesát tři")
+      , (54, "padesát čtyři")
+      , (55, "padesát pět")
+      , (56, "padesát šest")
+      , (57, "padesát sedm")
+      , (58, "padesát osm")
+      , (59, "padesát devět")
+      , (60, "šedesát")
+      , (61, "šedesát jedna")
+      , (62, "šedesát dva")
+      , (63, "šedesát tři")
+      , (64, "šedesát čtyři")
+      , (65, "šedesát pět")
+      , (66, "šedesát šest")
+      , (67, "šedesát sedm")
+      , (68, "šedesát osm")
+      , (69, "šedesát devět")
+      , (70, "sedmdesát")
+      , (71, "sedmdesát jedna")
+      , (72, "sedmdesát dva")
+      , (73, "sedmdesát tři")
+      , (74, "sedmdesát čtyři")
+      , (75, "sedmdesát pět")
+      , (76, "sedmdesát šest")
+      , (77, "sedmdesát sedm")
+      , (78, "sedmdesát osm")
+      , (79, "sedmdesát devět")
+      , (80, "osmdesát")
+      , (81, "osmdesát jedna")
+      , (82, "osmdesát dva")
+      , (83, "osmdesát tři")
+      , (84, "osmdesát čtyři")
+      , (85, "osmdesát pět")
+      , (86, "osmdesát šest")
+      , (87, "osmdesát sedm")
+      , (88, "osmdesát osm")
+      , (89, "osmdesát devět")
+      , (90, "devádesát")
+      , (91, "devádesát jedna")
+      , (92, "devádesát dva")
+      , (93, "devádesát tři")
+      , (94, "devádesát čtyři")
+      , (95, "devádesát pět")
+      , (96, "devádesát šest")
+      , (97, "devádesát sedm")
+      , (98, "devádesát osm")
+      , (99, "devádesát devět")
+      , (100, "sto")
+      , (101, "sto jedna")
+      , (102, "sto dva")
+      , (110, "sto deset")
+      , (120, "sto dvacet")
+      , (200, "dvě stě")
+      , (201, "dvě stě jedna") -- or is it "dvě stě jeden"?
+      , (300, "tři sta")
+      , (400, "čtyři sta")
+      , (500, "pět set")
+      , (600, "šest set")
+      , (700, "sedm set")
+      , (800, "osm set")
+      , (900, "devět set")
+      , (1000, "tisíc")
+      , (1001, "tisíc jedna") -- or is it "tisíc jeden"?
+      , (2000, "dva tisíce")
+      , (2007, "dva tisíce sedm")
+      , (2008, "dva tisíce osm")
+      , (3000, "tři tisíce")
+      , (4000, "čtyři tisíce")
+      , (5000, "pět tisíc")
+      , (6000, "šest tisíc")
+      , (7000, "sedm tisíc")
+      , (8000, "osm tisíc")
+      , (9000, "devět tisíc")
+      , (10000, "deset tisíc")
+      , (11000, "jedenáct tisíc")
+      , (25000, "dvacet pět tisíc")
+      , (50000, "padesát tisíc")
+      , (dec 5, "sto tisíc")
+      , (138000, "sto třicet osm tisíc")
+      , (dec 6, "milión")
+      , (2 * dec 6, "dva milióny")
+      , (5 * dec 6, "pět miliónů")
+      , (6 * dec 6, "šest miliónů")
+      , (7 * dec 6, "sedm miliónů")
+      , (dec 9, "miliarda")
+      , (dec 12, "bilión")
+      ]
+    )
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "první")
+      , (2, "druhý")
+      , (3, "třetí")
+      , (4, "čtvrtý")
+      , (5, "pátý")
+      , (6, "šestý")
+      , (7, "sedmý")
+      , (8, "osmý")
+      , (9, "devátý")
+      , (10, "desátý")
+      , (11, "jedenáctý")
+      , (12, "dvanáctý")
+      , (13, "třináctý")
+      , (14, "čtrnáctý")
+      , (15, "patnáctý")
+      , (16, "šestnáctý")
+      , (17, "sedmnáctý")
+      , (18, "osmnáctý")
+      , (19, "devatenáctý")
+      , (20, "dvacátý")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/CHN/TestData.hs b/src-test/Text/Numeral/Language/CHN/TestData.hs
--- a/src-test/Text/Numeral/Language/CHN/TestData.hs
+++ b/src-test/Text/Numeral/Language/CHN/TestData.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -23,15 +17,14 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 --------------------------------------------------------------------------------
 -- Test data
 --------------------------------------------------------------------------------
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/CHR/TestData.hs b/src-test/Text/Numeral/Language/CHR/TestData.hs
--- a/src-test/Text/Numeral/Language/CHR/TestData.hs
+++ b/src-test/Text/Numeral/Language/CHR/TestData.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -22,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -37,7 +30,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-cherokee/en/chr/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/CKU/TestData.hs b/src-test/Text/Numeral/Language/CKU/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/CKU/TestData.hs
@@ -0,0 +1,175 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        cku
+
+[@Native name@]     Kowassá:ti
+
+[@English name@]    Koasati
+-}
+module Text.Numeral.Language.CKU.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-koasati/en/cku/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "ikson")
+      , (1, "chaffaakan")
+      , (2, "toklon")
+      , (3, "totchiinan")
+      , (4, "ostaakan")
+      , (5, "chahappaakan")
+      , (6, "hannaalin")
+      , (7, "ontoklon")
+      , (8, "ontotchiinan")
+      , (9, "chakkaalin")
+      , (10, "pokkoolin")
+      , (11, "pokkol awah chaffaakan")
+      , (12, "pokkol awah toklon")
+      , (13, "pokkol awah totchiinan")
+      , (14, "pokkol awah ostaakan")
+      , (15, "pokkol awah chahappaakan")
+      , (16, "pokkol awah hannaalin")
+      , (17, "pokkol awah ontoklon")
+      , (18, "pokkol awah ontotchiinan")
+      , (19, "pokkol awah chakkaalin")
+      , (20, "poltoklon")
+      , (21, "poltoklon polo awah chaffaakan")
+      , (22, "poltoklon polo awah toklon")
+      , (23, "poltoklon polo awah totchiinan")
+      , (24, "poltoklon polo awah ostaakan")
+      , (25, "poltoklon polo awah chahappaakan")
+      , (26, "poltoklon polo awah hannaalin")
+      , (27, "poltoklon polo awah ontoklon")
+      , (28, "poltoklon polo awah ontotchiinan")
+      , (29, "poltoklon polo awah chakkaalin")
+      , (30, "poltotchiinan")
+      , (31, "poltotchiinan polo awah chaffaakan")
+      , (32, "poltotchiinan polo awah toklon")
+      , (33, "poltotchiinan polo awah totchiinan")
+      , (34, "poltotchiinan polo awah ostaakan")
+      , (35, "poltotchiinan polo awah chahappaakan")
+      , (36, "poltotchiinan polo awah hannaalin")
+      , (37, "poltotchiinan polo awah ontoklon")
+      , (38, "poltotchiinan polo awah ontotchiinan")
+      , (39, "poltotchiinan polo awah chakkaalin")
+      , (40, "polostaakan")
+      , (41, "polostaakan polo awah chaffaakan")
+      , (42, "polostaakan polo awah toklon")
+      , (43, "polostaakan polo awah totchiinan")
+      , (44, "polostaakan polo awah ostaakan")
+      , (45, "polostaakan polo awah chahappaakan")
+      , (46, "polostaakan polo awah hannaalin")
+      , (47, "polostaakan polo awah ontoklon")
+      , (48, "polostaakan polo awah ontotchiinan")
+      , (49, "polostaakan polo awah chakkaalin")
+      , (50, "polchahappaakan")
+      , (51, "polchahappaakan polo awah chaffaakan")
+      , (52, "polchahappaakan polo awah toklon")
+      , (53, "polchahappaakan polo awah totchiinan")
+      , (54, "polchahappaakan polo awah ostaakan")
+      , (55, "polchahappaakan polo awah chahappaakan")
+      , (56, "polchahappaakan polo awah hannaalin")
+      , (57, "polchahappaakan polo awah ontoklon")
+      , (58, "polchahappaakan polo awah ontotchiinan")
+      , (59, "polchahappaakan polo awah chakkaalin")
+      , (60, "polahannaalin")
+      , (61, "polahannaalin polo awah chaffaakan")
+      , (62, "polahannaalin polo awah toklon")
+      , (63, "polahannaalin polo awah totchiinan")
+      , (64, "polahannaalin polo awah ostaakan")
+      , (65, "polahannaalin polo awah chahappaakan")
+      , (66, "polahannaalin polo awah hannaalin")
+      , (67, "polahannaalin polo awah ontoklon")
+      , (68, "polahannaalin polo awah ontotchiinan")
+      , (69, "polahannaalin polo awah chakkaalin")
+      , (70, "polontoklon")
+      , (71, "polontoklon polo awah chaffaakan")
+      , (72, "polontoklon polo awah toklon")
+      , (73, "polontoklon polo awah totchiinan")
+      , (74, "polontoklon polo awah ostaakan")
+      , (75, "polontoklon polo awah chahappaakan")
+      , (76, "polontoklon polo awah hannaalin")
+      , (77, "polontoklon polo awah ontoklon")
+      , (78, "polontoklon polo awah ontotchiinan")
+      , (79, "polontoklon polo awah chakkaalin")
+      , (80, "polontotchiinan")
+      , (81, "polontotchiinan polo awah chaffaakan")
+      , (82, "polontotchiinan polo awah toklon")
+      , (83, "polontotchiinan polo awah totchiinan")
+      , (84, "polontotchiinan polo awah ostaakan")
+      , (85, "polontotchiinan polo awah chahappaakan")
+      , (86, "polontotchiinan polo awah hannaalin")
+      , (87, "polontotchiinan polo awah ontoklon")
+      , (88, "polontotchiinan polo awah ontotchiinan")
+      , (89, "polontotchiinan polo awah chakkaalin")
+      , (90, "polchakkaalin")
+      , (91, "polchakkaalin polo awah chaffaakan")
+      , (92, "polchakkaalin polo awah toklon")
+      , (93, "polchakkaalin polo awah totchiinan")
+      , (94, "polchakkaalin polo awah ostaakan")
+      , (95, "polchakkaalin polo awah chahappaakan")
+      , (96, "polchakkaalin polo awah hannaalin")
+      , (97, "polchakkaalin polo awah ontoklon")
+      , (98, "polchakkaalin polo awah ontotchiinan")
+      , (99, "polchakkaalin polo awah chakkaalin")
+      , (100, "chokpi chaffaakan")
+      , (101, "chokpi chaffaakan awah chaffaakan")
+      , (102, "chokpi chaffaakan awah toklon")
+      , (103, "chokpi chaffaakan awah totchiinan")
+      , (104, "chokpi chaffaakan awah ostaakan")
+      , (105, "chokpi chaffaakan awah chahappaakan")
+      , (106, "chokpi chaffaakan awah hannaalin")
+      , (107, "chokpi chaffaakan awah ontoklon")
+      , (108, "chokpi chaffaakan awah ontotchiinan")
+      , (109, "chokpi chaffaakan awah chakkaalin")
+      , (110, "chokpi chaffaakan awah pokkoolin")
+      , (123, "chokpi chaffaakan awah poltoklon polo awah totchiinan")
+      , (200, "chokpi toklon")
+      , (300, "chokpi totchiinan")
+      , (321, "chokpi totchiinan awah poltoklon polo awah chaffaakan")
+      , (400, "chokpi ostaakan")
+      , (500, "chokpi chahappaakan")
+      , (600, "chokpi hannaalin")
+      , (700, "chokpi ontoklon")
+      , (800, "chokpi ontotchiinan")
+      , (900, "chokpi chakkaalin")
+      , (909, "chokpi chakkaalin awah chakkaalin")
+      , (990, "chokpi chakkaalin awah polchakkaalin")
+      , (999, "chokpi chakkaalin awah polchakkaalin polo awah chakkaalin")
+      , (1000, "chokpachoba chaffaakan")
+      , (1001, "chokpachoba chaffaakan awah chaffaakan")
+      , (1008, "chokpachoba chaffaakan awah ontotchiinan")
+      , (1234, "chokpachoba chaffaakan awah chokpi toklon awah poltotchiinan polo awah ostaakan")
+      , (2000, "chokpachoba toklon")
+      , (3000, "chokpachoba totchiinan")
+      , (4000, "chokpachoba ostaakan")
+      , (4321, "chokpachoba ostaakan awah chokpi totchiinan awah poltoklon polo awah chaffaakan")
+      , (5000, "chokpachoba chahappaakan")
+      , (6000, "chokpachoba hannaalin")
+      , (7000, "chokpachoba ontoklon")
+      , (8000, "chokpachoba ontotchiinan")
+      , (9000, "chokpachoba chakkaalin")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/CLM/TestData.hs b/src-test/Text/Numeral/Language/CLM/TestData.hs
--- a/src-test/Text/Numeral/Language/CLM/TestData.hs
+++ b/src-test/Text/Numeral/Language/CLM/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -22,15 +17,14 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 --------------------------------------------------------------------------------
 -- Test data
 --------------------------------------------------------------------------------
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/CO/TestData.hs b/src-test/Text/Numeral/Language/CO/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/CO/TestData.hs
+++ /dev/null
@@ -1,225 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        co
-
-[@ISO639-2@]        cos
-
-[@ISO639-3@]        cos
-
-[@Native name@]     corsu
-
-[@English name@]    Corsican
--}
-module Text.Numeral.Language.CO.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-corsican/en/cos/
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "zéru")
-      , (1, "unu")
-      , (2, "dui")
-      , (3, "trè")
-      , (4, "quattru")
-      , (5, "cinque")
-      , (6, "séi")
-      , (7, "sétte")
-      , (8, "óttu")
-      , (9, "nóve")
-      , (10, "déce")
-      , (11, "òndeci")
-      , (12, "dòdeci")
-      , (13, "trèdeci")
-      , (14, "quattòrdeci")
-      , (15, "quindeci")
-      , (16, "sèdeci")
-      , (17, "dicessétte")
-      , (18, "dicióttu")
-      , (19, "dicennóve")
-      , (20, "vinti")
-      , (21, "vintunu")
-      , (22, "vintidui")
-      , (23, "vintitrè")
-      , (24, "vintiquattru")
-      , (25, "vinticinque")
-      , (26, "vintiséi")
-      , (27, "vintisétte")
-      , (28, "vintóttu")
-      , (29, "vintinóve")
-      , (30, "trènta")
-      , (31, "trèntunu")
-      , (32, "trèntadui")
-      , (33, "trèntatrè")
-      , (34, "trèntaquattru")
-      , (35, "trèntacinque")
-      , (36, "trèntaséi")
-      , (37, "trèntasétte")
-      , (38, "trèntóttu")
-      , (39, "trèntanóve")
-      , (40, "quaranta")
-      , (41, "quarantunu")
-      , (42, "quarantadui")
-      , (43, "quarantatrè")
-      , (44, "quarantaquattru")
-      , (45, "quarantacinque")
-      , (46, "quarantaséi")
-      , (47, "quarantasétte")
-      , (48, "quarantóttu")
-      , (49, "quarantanóve")
-      , (50, "cinquanta")
-      , (51, "cinquantunu")
-      , (52, "cinquantadui")
-      , (53, "cinquantatrè")
-      , (54, "cinquantaquattru")
-      , (55, "cinquantacinque")
-      , (56, "cinquantaséi")
-      , (57, "cinquantasétte")
-      , (58, "cinquantóttu")
-      , (59, "cinquantanóve")
-      , (60, "sessanta")
-      , (61, "sessantunu")
-      , (62, "sessantadui")
-      , (63, "sessantatrè")
-      , (64, "sessantaquattru")
-      , (65, "sessantacinque")
-      , (66, "sessantaséi")
-      , (67, "sessantasétte")
-      , (68, "sessantóttu")
-      , (69, "sessantanóve")
-      , (70, "settanta")
-      , (71, "settantunu")
-      , (72, "settantadui")
-      , (73, "settantatrè")
-      , (74, "settantaquattru")
-      , (75, "settantacinque")
-      , (76, "settantaséi")
-      , (77, "settantasétte")
-      , (78, "settantóttu")
-      , (79, "settantanóve")
-      , (80, "ottanta")
-      , (81, "ottantunu")
-      , (82, "ottantadui")
-      , (83, "ottantatrè")
-      , (84, "ottantaquattru")
-      , (85, "ottantacinque")
-      , (86, "ottantaséi")
-      , (87, "ottantasétte")
-      , (88, "ottantóttu")
-      , (89, "ottantanóve")
-      , (90, "novanta")
-      , (91, "novantunu")
-      , (92, "novantadui")
-      , (93, "novantatrè")
-      , (94, "novantaquattru")
-      , (95, "novantacinque")
-      , (96, "novantaséi")
-      , (97, "novantasétte")
-      , (98, "novantóttu")
-      , (99, "novantanóve")
-      , (100, "cèntu")
-      , (101, "cèntu è unu")
-      , (102, "cèntu è dui")
-      , (103, "cèntu è trè")
-      , (104, "cèntu è quattru")
-      , (105, "cèntu è cinque")
-      , (106, "cèntu è séi")
-      , (107, "cèntu è sétte")
-      , (108, "cèntu è óttu")
-      , (109, "cèntu è nóve")
-      , (110, "cèntu è déce")
-      , (123, "cèntuvintitrè")
-      , (200, "duiecèntu")
-      , (300, "trecèntu")
-      , (321, "trecèntu vintunu")
-      , (400, "quattrucèntu")
-      , (500, "cinquecèntu")
-      , (600, "séicèntu")
-      , (700, "séttecèntu")
-      , (800, "óttucèntu")
-      , (900, "nóvecèntu")
-      , (909, "nóvecèntu è nóve")
-      , (990, "nóvecèntu novanta")
-      , (999, "nóvecèntu novantanóve")
-      , (1000, "mille")
-      , (1001, "mille è unu")
-      , (1008, "mille è óttu")
-      , (1234, "mille è duiecèntu trèntaquattru")
-      , (2000, "duiemila")
-      , (3000, "trèmila")
-      , (4000, "quattrumila")
-      , (4321, "quattrumila è trecèntu vintunu")
-      , (5000, "cinquemila")
-      , (6000, "séimila")
-      , (7000, "séttemila")
-      , (8000, "óttumila")
-      , (9000, "nóvemila")
-      , (10000, "décemila")
-      , (12345, "dòdecimila è trecèntu quarantacinque")
-      , (20000, "vintimila")
-      , (30000, "trèntamila")
-      , (40000, "quarantamila")
-      , (50000, "cinquantamila")
-      , (54321, "cinquantaquattrumila è trecèntu vintunu")
-      , (60000, "sessantamila")
-      , (70000, "settantamila")
-      , (80000, "ottantamila")
-      , (90000, "novantamila")
-      , (100000, "cèntumila")
-      , (123456, "cèntuvintitrèmila è quattrucèntu cinquantaséi")
-      , (200000, "duiecèntumila")
-      , (300000, "trecèntumila")
-      , (400000, "quattrucèntumila")
-      , (500000, "cinquecèntumila")
-      , (600000, "séicèntumila")
-      , (654321, "séicèntu cinquantaquattrumila è trecèntu vintunu")
-      , (700000, "séttecèntumila")
-      , (800000, "óttucèntumila")
-      , (900000, "nóvecèntumila")
-      , (1000000, "un miliòne")
-      , (1000001, "un miliòne è unu")
-      , (1234567, "un miliòne è duiecèntu trèntaquattrumila è cinquecèntu sessantasétte")
-      , (2000000, "dui milioni")
-      , (3000000, "trè milioni")
-      , (4000000, "quattru milioni")
-      , (5000000, "cinque milioni")
-      , (6000000, "séi milioni")
-      , (7000000, "sétte milioni")
-      , (7654321, "sétte milioni è séicèntu cinquantaquattrumila è trecèntu vintunu")
-      , (8000000, "óttu milioni")
-      , (9000000, "nóve milioni")
-      , (1000000000, "una miliarda")
-      , (1000000001, "una miliarda è unu")
-      , (2000000000, "duie miliarde")
-      , (3000000000, "trè miliarde")
-      , (4000000000, "quattru miliarde")
-      , (5000000000, "cinque miliarde")
-      , (6000000000, "séi miliarde")
-      , (7000000000, "sétte miliarde")
-      , (8000000000, "óttu miliarde")
-      , (9000000000, "nóve miliarde")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/COD/TestData.hs b/src-test/Text/Numeral/Language/COD/TestData.hs
--- a/src-test/Text/Numeral/Language/COD/TestData.hs
+++ b/src-test/Text/Numeral/Language/COD/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-cocama/en/cod/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/COO/TestData.hs b/src-test/Text/Numeral/Language/COO/TestData.hs
--- a/src-test/Text/Numeral/Language/COO/TestData.hs
+++ b/src-test/Text/Numeral/Language/COO/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-comox/en/coo/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/COS/TestData.hs b/src-test/Text/Numeral/Language/COS/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/COS/TestData.hs
@@ -0,0 +1,219 @@
+{-|
+[@ISO639-1@]        co
+
+[@ISO639-2@]        cos
+
+[@ISO639-3@]        cos
+
+[@Native name@]     corsu
+
+[@English name@]    Corsican
+-}
+module Text.Numeral.Language.COS.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-corsican/en/cos/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "zéru")
+      , (1, "unu")
+      , (2, "dui")
+      , (3, "trè")
+      , (4, "quattru")
+      , (5, "cinque")
+      , (6, "séi")
+      , (7, "sétte")
+      , (8, "óttu")
+      , (9, "nóve")
+      , (10, "déce")
+      , (11, "òndeci")
+      , (12, "dòdeci")
+      , (13, "trèdeci")
+      , (14, "quattòrdeci")
+      , (15, "quindeci")
+      , (16, "sèdeci")
+      , (17, "dicessétte")
+      , (18, "dicióttu")
+      , (19, "dicennóve")
+      , (20, "vinti")
+      , (21, "vintunu")
+      , (22, "vintidui")
+      , (23, "vintitrè")
+      , (24, "vintiquattru")
+      , (25, "vinticinque")
+      , (26, "vintiséi")
+      , (27, "vintisétte")
+      , (28, "vintóttu")
+      , (29, "vintinóve")
+      , (30, "trènta")
+      , (31, "trèntunu")
+      , (32, "trèntadui")
+      , (33, "trèntatrè")
+      , (34, "trèntaquattru")
+      , (35, "trèntacinque")
+      , (36, "trèntaséi")
+      , (37, "trèntasétte")
+      , (38, "trèntóttu")
+      , (39, "trèntanóve")
+      , (40, "quaranta")
+      , (41, "quarantunu")
+      , (42, "quarantadui")
+      , (43, "quarantatrè")
+      , (44, "quarantaquattru")
+      , (45, "quarantacinque")
+      , (46, "quarantaséi")
+      , (47, "quarantasétte")
+      , (48, "quarantóttu")
+      , (49, "quarantanóve")
+      , (50, "cinquanta")
+      , (51, "cinquantunu")
+      , (52, "cinquantadui")
+      , (53, "cinquantatrè")
+      , (54, "cinquantaquattru")
+      , (55, "cinquantacinque")
+      , (56, "cinquantaséi")
+      , (57, "cinquantasétte")
+      , (58, "cinquantóttu")
+      , (59, "cinquantanóve")
+      , (60, "sessanta")
+      , (61, "sessantunu")
+      , (62, "sessantadui")
+      , (63, "sessantatrè")
+      , (64, "sessantaquattru")
+      , (65, "sessantacinque")
+      , (66, "sessantaséi")
+      , (67, "sessantasétte")
+      , (68, "sessantóttu")
+      , (69, "sessantanóve")
+      , (70, "settanta")
+      , (71, "settantunu")
+      , (72, "settantadui")
+      , (73, "settantatrè")
+      , (74, "settantaquattru")
+      , (75, "settantacinque")
+      , (76, "settantaséi")
+      , (77, "settantasétte")
+      , (78, "settantóttu")
+      , (79, "settantanóve")
+      , (80, "ottanta")
+      , (81, "ottantunu")
+      , (82, "ottantadui")
+      , (83, "ottantatrè")
+      , (84, "ottantaquattru")
+      , (85, "ottantacinque")
+      , (86, "ottantaséi")
+      , (87, "ottantasétte")
+      , (88, "ottantóttu")
+      , (89, "ottantanóve")
+      , (90, "novanta")
+      , (91, "novantunu")
+      , (92, "novantadui")
+      , (93, "novantatrè")
+      , (94, "novantaquattru")
+      , (95, "novantacinque")
+      , (96, "novantaséi")
+      , (97, "novantasétte")
+      , (98, "novantóttu")
+      , (99, "novantanóve")
+      , (100, "cèntu")
+      , (101, "cèntu è unu")
+      , (102, "cèntu è dui")
+      , (103, "cèntu è trè")
+      , (104, "cèntu è quattru")
+      , (105, "cèntu è cinque")
+      , (106, "cèntu è séi")
+      , (107, "cèntu è sétte")
+      , (108, "cèntu è óttu")
+      , (109, "cèntu è nóve")
+      , (110, "cèntu è déce")
+      , (123, "cèntuvintitrè")
+      , (200, "duiecèntu")
+      , (300, "trecèntu")
+      , (321, "trecèntu vintunu")
+      , (400, "quattrucèntu")
+      , (500, "cinquecèntu")
+      , (600, "séicèntu")
+      , (700, "séttecèntu")
+      , (800, "óttucèntu")
+      , (900, "nóvecèntu")
+      , (909, "nóvecèntu è nóve")
+      , (990, "nóvecèntu novanta")
+      , (999, "nóvecèntu novantanóve")
+      , (1000, "mille")
+      , (1001, "mille è unu")
+      , (1008, "mille è óttu")
+      , (1234, "mille è duiecèntu trèntaquattru")
+      , (2000, "duiemila")
+      , (3000, "trèmila")
+      , (4000, "quattrumila")
+      , (4321, "quattrumila è trecèntu vintunu")
+      , (5000, "cinquemila")
+      , (6000, "séimila")
+      , (7000, "séttemila")
+      , (8000, "óttumila")
+      , (9000, "nóvemila")
+      , (10000, "décemila")
+      , (12345, "dòdecimila è trecèntu quarantacinque")
+      , (20000, "vintimila")
+      , (30000, "trèntamila")
+      , (40000, "quarantamila")
+      , (50000, "cinquantamila")
+      , (54321, "cinquantaquattrumila è trecèntu vintunu")
+      , (60000, "sessantamila")
+      , (70000, "settantamila")
+      , (80000, "ottantamila")
+      , (90000, "novantamila")
+      , (100000, "cèntumila")
+      , (123456, "cèntuvintitrèmila è quattrucèntu cinquantaséi")
+      , (200000, "duiecèntumila")
+      , (300000, "trecèntumila")
+      , (400000, "quattrucèntumila")
+      , (500000, "cinquecèntumila")
+      , (600000, "séicèntumila")
+      , (654321, "séicèntu cinquantaquattrumila è trecèntu vintunu")
+      , (700000, "séttecèntumila")
+      , (800000, "óttucèntumila")
+      , (900000, "nóvecèntumila")
+      , (1000000, "un miliòne")
+      , (1000001, "un miliòne è unu")
+      , (1234567, "un miliòne è duiecèntu trèntaquattrumila è cinquecèntu sessantasétte")
+      , (2000000, "dui milioni")
+      , (3000000, "trè milioni")
+      , (4000000, "quattru milioni")
+      , (5000000, "cinque milioni")
+      , (6000000, "séi milioni")
+      , (7000000, "sétte milioni")
+      , (7654321, "sétte milioni è séicèntu cinquantaquattrumila è trecèntu vintunu")
+      , (8000000, "óttu milioni")
+      , (9000000, "nóve milioni")
+      , (1000000000, "una miliarda")
+      , (1000000001, "una miliarda è unu")
+      , (2000000000, "duie miliarde")
+      , (3000000000, "trè miliarde")
+      , (4000000000, "quattru miliarde")
+      , (5000000000, "cinque miliarde")
+      , (6000000000, "séi miliarde")
+      , (7000000000, "sétte miliarde")
+      , (8000000000, "óttu miliarde")
+      , (9000000000, "nóve miliarde")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/CRG/TestData.hs b/src-test/Text/Numeral/Language/CRG/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/CRG/TestData.hs
@@ -0,0 +1,138 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        crg
+
+[@Native name@]     Michif
+
+[@English name@]    Michif
+-}
+module Text.Numeral.Language.CRG.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-michif/en/crg/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "aeñ")
+      , (2, "deu")
+      , (3, "trwá")
+      , (4, "kátr")
+      , (5, "saeñk")
+      , (6, "sis")
+      , (7, "set")
+      , (8, "wit")
+      , (9, "naef")
+      , (10, "jis")
+      , (11, "óñz")
+      , (12, "dóz")
+      , (13, "trayz")
+      , (14, "katorz")
+      , (15, "kaeñz")
+      , (16, "saeñz")
+      , (17, "jis set")
+      , (18, "jis wit")
+      , (19, "jis naef")
+      , (20, "vaeñ")
+      , (21, "vaeñ aeñ")
+      , (22, "vaeñ deu")
+      , (23, "vaeñ trwá")
+      , (24, "vaeñ kátr")
+      , (25, "vaeñ saeñk")
+      , (26, "vaeñ sis")
+      , (27, "vaeñ set")
+      , (28, "vaeñ wit")
+      , (29, "vaeñ naef")
+      , (30, "tráñt")
+      , (31, "tráñt aeñ")
+      , (32, "tráñt deu")
+      , (33, "tráñt trwá")
+      , (34, "tráñt kátr")
+      , (35, "tráñt saeñk")
+      , (36, "tráñt sis")
+      , (37, "tráñt set")
+      , (38, "tráñt wit")
+      , (39, "tráñt naef")
+      , (40, "karánt")
+      , (41, "karánt aeñ")
+      , (42, "karánt deu")
+      , (43, "karánt trwá")
+      , (44, "karánt kátr")
+      , (45, "karánt saeñk")
+      , (46, "karánt sis")
+      , (47, "karánt set")
+      , (48, "karánt wit")
+      , (49, "karánt naef")
+      , (50, "saeñkánt")
+      , (51, "saeñkánt aeñ")
+      , (52, "saeñkánt deu")
+      , (53, "saeñkánt trwá")
+      , (54, "saeñkánt kátr")
+      , (55, "saeñkánt saeñk")
+      , (56, "saeñkánt sis")
+      , (57, "saeñkánt set")
+      , (58, "saeñkánt wit")
+      , (59, "saeñkánt naef")
+      , (60, "swesáñt")
+      , (61, "swesáñt aeñ")
+      , (62, "swesáñt deu")
+      , (63, "swesáñt trwá")
+      , (64, "swesáñt kátr")
+      , (65, "swesáñt saeñk")
+      , (66, "swesáñt sis")
+      , (67, "swesáñt set")
+      , (68, "swesáñt wit")
+      , (69, "swesáñt naef")
+      , (70, "swesáñty jis")
+      , (71, "swesáñty jis aeñ")
+      , (72, "swesáñty jis deu")
+      , (73, "swesáñty jis trwá")
+      , (74, "swesáñty jis kátr")
+      , (75, "swesáñty jis saeñk")
+      , (76, "swesáñty jis sis")
+      , (77, "swesáñty jis set")
+      , (78, "swesáñty jis wit")
+      , (79, "swesáñty jis naef")
+      , (80, "katávaeñ")
+      , (81, "katávaeñ aeñ")
+      , (82, "katávaeñ deu")
+      , (83, "katávaeñ trwá")
+      , (84, "katávaeñ kátr")
+      , (85, "katávaeñ saeñk")
+      , (86, "katávaeñ sis")
+      , (87, "katávaeñ set")
+      , (88, "katávaeñ wit")
+      , (89, "katávaeñ naef")
+      , (90, "katrávaen jis")
+      , (91, "katrávaen jis aeñ")
+      , (92, "katrávaen jis deu")
+      , (93, "katrávaen jis trwá")
+      , (94, "katrávaen jis kátr")
+      , (95, "katrávaen jis saeñk")
+      , (96, "katrávaen jis sis")
+      , (97, "katrávaen jis set")
+      , (98, "katrávaen jis wit")
+      , (99, "katrávaen jis naef")
+      , (100, "sáñ")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/CRO/TestData.hs b/src-test/Text/Numeral/Language/CRO/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/CRO/TestData.hs
@@ -0,0 +1,114 @@
+{-|
+[@ISO639-1@]        hr
+
+[@ISO639-2B@]       cro
+
+[@ISO639-3@]        cro
+
+[@Native name@]     Hrvatski
+
+[@English name@]    Croatian
+-}
+
+
+module Text.Numeral.Language.CRO.TestData
+    ( cardinals
+    ) where
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ("default"
+    , defaultInflection
+    , [ (0, "nula")
+      , (1, "jedan")
+      , (2, "dva")
+      , (3, "tri")
+      , (4, "četiri")
+      , (5, "pet")
+      , (6, "šest")
+      , (7, "sedam")
+      , (8, "osam")
+      , (9, "devet")
+      , (10, "deset")
+      , (11, "jedanaest")
+      , (12, "dvanaest")
+      , (13, "trinaest")
+      , (14, "četrnaest")
+      , (15, "petnaest")
+      , (16, "šesnaest")
+      , (17, "sedamnaest")
+      , (18, "osamnaest")
+      , (19, "devetnaest")
+      , (20, "dvadeset")
+      , (21, "dvadeset jedan")
+      , (22, "dvadeset dva")
+      , (23, "dvadeset tri")
+      , (24, "dvadeset četiri")
+      , (25, "dvadeset pet")
+      , (26, "dvadeset šest")
+      , (27, "dvadeset sedam")
+      , (28, "dvadeset osam")
+      , (29, "dvadeset devet")
+      , (30, "trideset")
+      , (31, "trideset jedan")
+      , (32, "trideset dva")
+      , (33, "trideset tri")
+      , (34, "trideset četiri")
+      , (35, "trideset pet")
+      , (36, "trideset šest")
+      , (37, "trideset sedam")
+      , (38, "trideset osam")
+      , (39, "trideset devet")
+      , (40, "četrdeset")
+      , (50, "pedeset")
+      , (60, "šesdeset")
+      , (62, "šesdeset dva")
+      , (70, "sedamdeset")
+      , (80, "osamdeset")
+      , (90, "devedeset")
+      , (93, "devedeset tri")
+      , (98, "devedeset osam")
+      , (99, "devedeset devet")
+      , (100, "sto")
+      , (101, "sto jedan")
+      , (102, "sto dva")
+      , (110, "sto deset")
+      , (111, "sto jedanaest")
+      , (116, "sto šesnaest")
+      , (126, "sto dvadeset šest")
+      , (150, "sto pedeset")
+      , (156, "sto pedeset šest")
+      , (500, "petsto")
+      , (634, "šesto trideset četiri")
+      , (999, "devetsto devedeset devet")
+      , (1000, "tisuću")
+      , (1100, "tisuću sto")
+      , (1101, "tisuću sto jedan")
+      , (1102, "tisuću sto dva")
+      , (1110, "tisuću sto deset")
+      , (1111, "tisuću sto jedanaest")
+      , (1116, "tisuću sto šesnaest")
+      , (1126, "tisuću sto dvadeset šest")
+      , (1150, "tisuću sto pedeset")
+      , (1156, "tisuću sto pedeset šest")
+      , (1500, "tisuću petsto")
+      , (1634, "tisuću šesto trideset četiri")
+      , (17999, "sedamnaest tisuća devetsto devedeset devet")
+      , (25358, "dvadeset pet tisuća tristo pedeset osam")
+      , (105358, "sto pet tisuća tristo pedeset osam")
+      , (246912, "dvjesto četrdeset šest tisuća devetsto dvanaest")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/CS/TestData.hs b/src-test/Text/Numeral/Language/CS/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/CS/TestData.hs
+++ /dev/null
@@ -1,212 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        cs
-
-[@ISO639-2B@]       cze
-
-[@ISO639-2T@]       ces
-
-[@ISO639-3@]        ces
-
-[@Native name@]     Čeština
-
-[@English name@]    Czech
--}
-
-module Text.Numeral.Language.CS.TestData (cardinals, ordinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "nula")
-      , (1, "jeden")
-      , (2, "dva")
-      , (3, "tři")
-      , (4, "čtyři")
-      , (5, "pět")
-      , (6, "šest")
-      , (7, "sedm")
-      , (8, "osm")
-      , (9, "devět")
-      , (10, "deset")
-      , (11, "jedenáct")
-      , (12, "dvanáct")
-      , (13, "třináct")
-      , (14, "ctrnáct")
-      , (15, "patnáct")
-      , (16, "šestnáct")
-      , (17, "sedmnáct")
-      , (18, "osmnáct")
-      , (19, "devatenáct")
-      , (20, "dvacet")
-      , (21, "dvacet jedna")
-      , (22, "dvacet dva")
-      , (23, "dvacet tři")
-      , (24, "dvacet čtyři")
-      , (25, "dvacet pět")
-      , (26, "dvacet šest")
-      , (27, "dvacet sedm")
-      , (28, "dvacet osm")
-      , (29, "dvacet devět")
-      , (30, "třicet")
-      , (31, "třicet jedna")
-      , (32, "třicet dva")
-      , (33, "třicet tři")
-      , (34, "třicet čtyři")
-      , (35, "třicet pět")
-      , (36, "třicet šest")
-      , (37, "třicet sedm")
-      , (38, "třicet osm")
-      , (39, "třicet devět")
-      , (40, "čtyřicet")
-      , (41, "čtyřicet jedna")
-      , (42, "čtyřicet dva")
-      , (43, "čtyřicet tři")
-      , (44, "čtyřicet čtyři")
-      , (45, "čtyřicet pět")
-      , (46, "čtyřicet šest")
-      , (47, "čtyřicet sedm")
-      , (48, "čtyřicet osm")
-      , (49, "čtyřicet devět")
-      , (50, "padesát")
-      , (51, "padesát jedna")
-      , (52, "padesát dva")
-      , (53, "padesát tři")
-      , (54, "padesát čtyři")
-      , (55, "padesát pět")
-      , (56, "padesát šest")
-      , (57, "padesát sedm")
-      , (58, "padesát osm")
-      , (59, "padesát devět")
-      , (60, "šedesát")
-      , (61, "šedesát jedna")
-      , (62, "šedesát dva")
-      , (63, "šedesát tři")
-      , (64, "šedesát čtyři")
-      , (65, "šedesát pět")
-      , (66, "šedesát šest")
-      , (67, "šedesát sedm")
-      , (68, "šedesát osm")
-      , (69, "šedesát devět")
-      , (70, "sedmdesát")
-      , (71, "sedmdesát jedna")
-      , (72, "sedmdesát dva")
-      , (73, "sedmdesát tři")
-      , (74, "sedmdesát čtyři")
-      , (75, "sedmdesát pět")
-      , (76, "sedmdesát šest")
-      , (77, "sedmdesát sedm")
-      , (78, "sedmdesát osm")
-      , (79, "sedmdesát devět")
-      , (80, "osmdesát")
-      , (81, "osmdesát jedna")
-      , (82, "osmdesát dva")
-      , (83, "osmdesát tři")
-      , (84, "osmdesát čtyři")
-      , (85, "osmdesát pět")
-      , (86, "osmdesát šest")
-      , (87, "osmdesát sedm")
-      , (88, "osmdesát osm")
-      , (89, "osmdesát devět")
-      , (90, "devádesát")
-      , (91, "devádesát jedna")
-      , (92, "devádesát dva")
-      , (93, "devádesát tři")
-      , (94, "devádesát čtyři")
-      , (95, "devádesát pět")
-      , (96, "devádesát šest")
-      , (97, "devádesát sedm")
-      , (98, "devádesát osm")
-      , (99, "devádesát devět")
-      , (100, "sto")
-      , (101, "sto jedna")
-      , (102, "sto dva")
-      , (110, "sto deset")
-      , (120, "sto dvacet")
-      , (200, "dvě stě")
-      , (201, "dvě stě jedna") -- or is it "dvě stě jeden"?
-      , (300, "tři sta")
-      , (400, "čtyři sta")
-      , (500, "pět set")
-      , (600, "šest set")
-      , (700, "sedm set")
-      , (800, "osm set")
-      , (900, "devět set")
-      , (1000, "tisíc")
-      , (1001, "tisíc jedna") -- or is it "tisíc jeden"?
-      , (2000, "dva tisíce")
-      , (2007, "dva tisíce sedm")
-      , (2008, "dva tisíce osm")
-      , (3000, "tři tisíce")
-      , (4000, "čtyři tisíce")
-      , (5000, "pět tisíc")
-      , (6000, "šest tisíc")
-      , (7000, "sedm tisíc")
-      , (8000, "osm tisíc")
-      , (9000, "devět tisíc")
-      , (10000, "deset tisíc")
-      , (11000, "jedenáct tisíc")
-      , (25000, "dvacet pět tisíc")
-      , (50000, "padesát tisíc")
-      , (dec 5, "sto tisíc")
-      , (138000, "sto třicet osm tisíc")
-      , (dec 6, "milión")
-      , (2 ⋅ dec 6, "dva milióny")
-      , (5 ⋅ dec 6, "pět miliónů")
-      , (6 ⋅ dec 6, "šest miliónů")
-      , (7 ⋅ dec 6, "sedm miliónů")
-      , (dec 9, "miliarda")
-      , (dec 12, "bilión")
-      ]
-    )
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "první")
-      , (2, "druhý")
-      , (3, "třetí")
-      , (4, "čtvrtý")
-      , (5, "pátý")
-      , (6, "šestý")
-      , (7, "sedmý")
-      , (8, "osmý")
-      , (9, "devátý")
-      , (10, "desátý")
-      , (11, "jedenáctý")
-      , (12, "dvanáctý")
-      , (13, "třináctý")
-      , (14, "čtrnáctý")
-      , (15, "patnáctý")
-      , (16, "šestnáctý")
-      , (17, "sedmnáctý")
-      , (18, "osmnáctý")
-      , (19, "devatenáctý")
-      , (20, "dvacátý")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/CY/TestData.hs b/src-test/Text/Numeral/Language/CY/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/CY/TestData.hs
+++ /dev/null
@@ -1,178 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        cy
-
-[@ISO639-2B@]       wel
-
-[@ISO639-2T@]       cym
-
-[@ISO639-3@]        cym
-
-[@Native name@]     Cymraeg
-
-[@English name@]    Welsh
--}
-
-module Text.Numeral.Language.CY.TestData (cardinals, ordinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
--- Sources:
---   http://mylanguages.org/welsh_numbers.php
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "dim")
-      , (1, "un")
-      , (2, "dau")
-      , (3, "tri")
-      , (4, "pedwar")
-      , (5, "pump")
-      , (6, "chwech")
-      , (7, "saith")
-      , (8, "wyth")
-      , (9, "naw")
-      , (10, "deg")
-      , (11, "un deg un")
-      , (12, "un deg dau")
-      , (13, "un deg tri")
-      , (14, "un deg pedwar")
-      , (15, "un deg pump")
-      , (16, "un deg chwech")
-      , (17, "un deg saith")
-      , (18, "un deg wyth")
-      , (19, "un deg naw")
-      , (20, "dau deg")
-      , (21, "dau deg un")
-      , (22, "dau deg dau")
-      , (23, "dau deg tri")
-      , (24, "dau deg pedwar")
-      , (25, "dau deg pump")
-      , (26, "dau deg chwech")
-      , (27, "dau deg saith")
-      , (28, "dau deg wyth")
-      , (29, "dau deg naw")
-      , (30, "tri deg")
-      , (31, "tri deg un")
-      , (32, "tri deg dau")
-      , (33, "tri deg tri")
-      , (34, "tri deg pedwar")
-      , (35, "tri deg pump")
-      , (36, "tri deg chwech")
-      , (37, "tri deg saith")
-      , (38, "tri deg wyth")
-      , (39, "tri deg naw")
-      , (40, "pedwar deg")
-      , (41, "pedwar deg un")
-      , (42, "pedwar deg dau")
-      , (43, "pedwar deg tri")
-      , (44, "pedwar deg pedwar")
-      , (45, "pedwar deg pump")
-      , (46, "pedwar deg chwech")
-      , (47, "pedwar deg saith")
-      , (48, "pedwar deg wyth")
-      , (49, "pedwar deg naw")
-      , (50, "pum deg")
-      , (51, "pum deg un")
-      , (52, "pum deg dau")
-      , (53, "pum deg tri")
-      , (54, "pum deg pedwar")
-      , (55, "pum deg pump")
-      , (56, "pum deg chwech")
-      , (57, "pum deg saith")
-      , (58, "pum deg wyth")
-      , (59, "pum deg naw")
-      , (60, "chwe deg")
-      , (61, "chwe deg un")
-      , (62, "chwe deg dau")
-      , (63, "chwe deg tri")
-      , (64, "chwe deg pedwar")
-      , (65, "chwe deg pump")
-      , (66, "chwe deg chwech")
-      , (67, "chwe deg saith")
-      , (68, "chwe deg wyth")
-      , (69, "chwe deg naw")
-      , (70, "saith deg")
-      , (71, "saith deg un")
-      , (72, "saith deg dau")
-      , (73, "saith deg tri")
-      , (74, "saith deg pedwar")
-      , (75, "saith deg pump")
-      , (76, "saith deg chwech")
-      , (77, "saith deg saith")
-      , (78, "saith deg wyth")
-      , (79, "saith deg naw")
-      , (80, "wyth deg")
-      , (81, "wyth deg un")
-      , (82, "wyth deg dau")
-      , (83, "wyth deg tri")
-      , (84, "wyth deg pedwar")
-      , (85, "wyth deg pump")
-      , (86, "wyth deg chwech")
-      , (87, "wyth deg saith")
-      , (88, "wyth deg wyth")
-      , (89, "wyth deg naw")
-      , (90, "naw deg")
-      , (91, "naw deg un")
-      , (92, "naw deg dau")
-      , (93, "naw deg tri")
-      , (94, "naw deg pedwar")
-      , (95, "naw deg pump")
-      , (96, "naw deg chwech")
-      , (97, "naw deg saith")
-      , (98, "naw deg wyth")
-      , (99, "naw deg naw")
-      , (100, "cant")
-      , (1000, "un thousand")
-      , (dec 6, "miliwn")
-      ]
-    )
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "gyntaf")
-      , (2, "ail")
-      , (3, "trydydd")
-      , (4, "pedwerydd")
-      , (5, "pumed")
-      , (6, "chweched")
-      , (7, "seithfed")
-      , (8, "wythfed")
-      , (9, "nawfed")
-      , (10, "degfed")
-      , (11, "unfed ar ddeg")
-      , (12, "deuddegfed")
-      , (13, "drydedd ar ddeg")
-      , (14, "ddeg")
-      , (15, "pymthegfed")
-      , (16, "ar bymtheg")
-      , (17, "ail ar bymtheg")
-      , (18, "deunawfed")
-      , (19, "bedwaredd ganrif ar bymtheg")
-      , (20, "ugeinfed")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/CYM/TestData.hs b/src-test/Text/Numeral/Language/CYM/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/CYM/TestData.hs
@@ -0,0 +1,171 @@
+{-|
+[@ISO639-1@]        cy
+
+[@ISO639-2B@]       wel
+
+[@ISO639-2T@]       cym
+
+[@ISO639-3@]        cym
+
+[@Native name@]     Cymraeg
+
+[@English name@]    Welsh
+-}
+
+module Text.Numeral.Language.CYM.TestData (cardinals, ordinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+-- Sources:
+--   http://mylanguages.org/welsh_numbers.php
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "dim")
+      , (1, "un")
+      , (2, "dau")
+      , (3, "tri")
+      , (4, "pedwar")
+      , (5, "pump")
+      , (6, "chwech")
+      , (7, "saith")
+      , (8, "wyth")
+      , (9, "naw")
+      , (10, "deg")
+      , (11, "un deg un")
+      , (12, "un deg dau")
+      , (13, "un deg tri")
+      , (14, "un deg pedwar")
+      , (15, "un deg pump")
+      , (16, "un deg chwech")
+      , (17, "un deg saith")
+      , (18, "un deg wyth")
+      , (19, "un deg naw")
+      , (20, "dau deg")
+      , (21, "dau deg un")
+      , (22, "dau deg dau")
+      , (23, "dau deg tri")
+      , (24, "dau deg pedwar")
+      , (25, "dau deg pump")
+      , (26, "dau deg chwech")
+      , (27, "dau deg saith")
+      , (28, "dau deg wyth")
+      , (29, "dau deg naw")
+      , (30, "tri deg")
+      , (31, "tri deg un")
+      , (32, "tri deg dau")
+      , (33, "tri deg tri")
+      , (34, "tri deg pedwar")
+      , (35, "tri deg pump")
+      , (36, "tri deg chwech")
+      , (37, "tri deg saith")
+      , (38, "tri deg wyth")
+      , (39, "tri deg naw")
+      , (40, "pedwar deg")
+      , (41, "pedwar deg un")
+      , (42, "pedwar deg dau")
+      , (43, "pedwar deg tri")
+      , (44, "pedwar deg pedwar")
+      , (45, "pedwar deg pump")
+      , (46, "pedwar deg chwech")
+      , (47, "pedwar deg saith")
+      , (48, "pedwar deg wyth")
+      , (49, "pedwar deg naw")
+      , (50, "pum deg")
+      , (51, "pum deg un")
+      , (52, "pum deg dau")
+      , (53, "pum deg tri")
+      , (54, "pum deg pedwar")
+      , (55, "pum deg pump")
+      , (56, "pum deg chwech")
+      , (57, "pum deg saith")
+      , (58, "pum deg wyth")
+      , (59, "pum deg naw")
+      , (60, "chwe deg")
+      , (61, "chwe deg un")
+      , (62, "chwe deg dau")
+      , (63, "chwe deg tri")
+      , (64, "chwe deg pedwar")
+      , (65, "chwe deg pump")
+      , (66, "chwe deg chwech")
+      , (67, "chwe deg saith")
+      , (68, "chwe deg wyth")
+      , (69, "chwe deg naw")
+      , (70, "saith deg")
+      , (71, "saith deg un")
+      , (72, "saith deg dau")
+      , (73, "saith deg tri")
+      , (74, "saith deg pedwar")
+      , (75, "saith deg pump")
+      , (76, "saith deg chwech")
+      , (77, "saith deg saith")
+      , (78, "saith deg wyth")
+      , (79, "saith deg naw")
+      , (80, "wyth deg")
+      , (81, "wyth deg un")
+      , (82, "wyth deg dau")
+      , (83, "wyth deg tri")
+      , (84, "wyth deg pedwar")
+      , (85, "wyth deg pump")
+      , (86, "wyth deg chwech")
+      , (87, "wyth deg saith")
+      , (88, "wyth deg wyth")
+      , (89, "wyth deg naw")
+      , (90, "naw deg")
+      , (91, "naw deg un")
+      , (92, "naw deg dau")
+      , (93, "naw deg tri")
+      , (94, "naw deg pedwar")
+      , (95, "naw deg pump")
+      , (96, "naw deg chwech")
+      , (97, "naw deg saith")
+      , (98, "naw deg wyth")
+      , (99, "naw deg naw")
+      , (100, "cant")
+      , (1000, "un thousand")
+      , (dec 6, "miliwn")
+      ]
+    )
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "gyntaf")
+      , (2, "ail")
+      , (3, "trydydd")
+      , (4, "pedwerydd")
+      , (5, "pumed")
+      , (6, "chweched")
+      , (7, "seithfed")
+      , (8, "wythfed")
+      , (9, "nawfed")
+      , (10, "degfed")
+      , (11, "unfed ar ddeg")
+      , (12, "deuddegfed")
+      , (13, "drydedd ar ddeg")
+      , (14, "ddeg")
+      , (15, "pymthegfed")
+      , (16, "ar bymtheg")
+      , (17, "ail ar bymtheg")
+      , (18, "deunawfed")
+      , (19, "bedwaredd ganrif ar bymtheg")
+      , (20, "ugeinfed")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/DE/TestData.hs b/src-test/Text/Numeral/Language/DE/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/DE/TestData.hs
+++ /dev/null
@@ -1,475 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        de
-
-[@ISO639-2B@]       ger
-
-[@ISO639-2T@]       deu
-
-[@ISO639-3@]        deu
-
-[@Native name@]     Deutsch
-
-[@English name@]    German
--}
-
-module Text.Numeral.Language.DE.TestData (cardinals, ordinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://de.wikipedia.org/wiki/Zahlennamen
-  http://german.about.com/library/blzahlen.htm
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "null")
-      , (1, "eins")
-      , (2, "zwei")
-      , (3, "drei")
-      , (4, "vier")
-      , (5, "fünf")
-      , (6, "sechs")
-      , (7, "sieben")
-      , (8, "acht")
-      , (9, "neun")
-      , (10, "zehn")
-      , (11, "elf")
-      , (12, "zwölf")
-      , (13, "dreizehn")
-      , (14, "vierzehn")
-      , (15, "fünfzehn")
-      , (16, "sechzehn")
-      , (17, "siebzehn")
-      , (18, "achtzehn")
-      , (19, "neunzehn")
-      , (20, "zwanzig")
-      , (21, "einundzwanzig")
-      , (22, "zweiundzwanzig")
-      , (23, "dreiundzwanzig")
-      , (24, "vierundzwanzig")
-      , (25, "fünfundzwanzig")
-      , (26, "sechsundzwanzig")
-      , (27, "siebenundzwanzig")
-      , (28, "achtundzwanzig")
-      , (29, "neunundzwanzig")
-      , (30, "dreißig")
-      , (31, "einunddreißig")
-      , (32, "zweiunddreißig")
-      , (33, "dreiunddreißig")
-      , (34, "vierunddreißig")
-      , (35, "fünfunddreißig")
-      , (36, "sechsunddreißig")
-      , (37, "siebenunddreißig")
-      , (38, "achtunddreißig")
-      , (39, "neununddreißig")
-      , (40, "vierzig")
-      , (41, "einundvierzig")
-      , (42, "zweiundvierzig")
-      , (43, "dreiundvierzig")
-      , (44, "vierundvierzig")
-      , (45, "fünfundvierzig")
-      , (46, "sechsundvierzig")
-      , (47, "siebenundvierzig")
-      , (48, "achtundvierzig")
-      , (49, "neunundvierzig")
-      , (50, "fünfzig")
-      , (51, "einundfünfzig")
-      , (52, "zweiundfünfzig")
-      , (53, "dreiundfünfzig")
-      , (54, "vierundfünfzig")
-      , (55, "fünfundfünfzig")
-      , (56, "sechsundfünfzig")
-      , (57, "siebenundfünfzig")
-      , (58, "achtundfünfzig")
-      , (59, "neunundfünfzig")
-      , (60, "sechzig")
-      , (61, "einundsechzig")
-      , (62, "zweiundsechzig")
-      , (63, "dreiundsechzig")
-      , (64, "vierundsechzig")
-      , (65, "fünfundsechzig")
-      , (66, "sechsundsechzig")
-      , (67, "siebenundsechzig")
-      , (68, "achtundsechzig")
-      , (69, "neunundsechzig")
-      , (70, "siebzig")
-      , (71, "einundsiebzig")
-      , (72, "zweiundsiebzig")
-      , (73, "dreiundsiebzig")
-      , (74, "vierundsiebzig")
-      , (75, "fünfundsiebzig")
-      , (76, "sechsundsiebzig")
-      , (77, "siebenundsiebzig")
-      , (78, "achtundsiebzig")
-      , (79, "neunundsiebzig")
-      , (80, "achtzig")
-      , (81, "einundachtzig")
-      , (82, "zweiundachtzig")
-      , (83, "dreiundachtzig")
-      , (84, "vierundachtzig")
-      , (85, "fünfundachtzig")
-      , (86, "sechsundachtzig")
-      , (87, "siebenundachtzig")
-      , (88, "achtundachtzig")
-      , (89, "neunundachtzig")
-      , (90, "neunzig")
-      , (91, "einundneunzig")
-      , (92, "zweiundneunzig")
-      , (93, "dreiundneunzig")
-      , (94, "vierundneunzig")
-      , (95, "fünfundneunzig")
-      , (96, "sechsundneunzig")
-      , (97, "siebenundneunzig")
-      , (98, "achtundneunzig")
-      , (99, "neunundneunzig")
-      , (100, "hundert")
-      , (101, "hunderteins")
-      , (102, "hundertzwei")
-      , (103, "hundertdrei")
-      , (153, "hundertdreiundfünfzig")
-      , (200, "zweihundert")
-      , (201, "zweihunderteins")
-      , (202, "zweihundertzwei")
-      , (203, "zweihundertdrei")
-      , (204, "zweihundertvier")
-      , (205, "zweihundertfünf")
-      , (206, "zweihundertsechs")
-      , (207, "zweihundertsieben")
-      , (208, "zweihundertacht")
-      , (209, "zweihundertneun")
-      , (210, "zweihundertzehn")
-      , (211, "zweihundertelf")
-      , (212, "zweihundertzwölf")
-      , (213, "zweihundertdreizehn")
-      , (214, "zweihundertvierzehn")
-      , (215, "zweihundertfünfzehn")
-      , (216, "zweihundertsechzehn")
-      , (217, "zweihundertsiebzehn")
-      , (218, "zweihundertachtzehn")
-      , (219, "zweihundertneunzehn")
-      , (220, "zweihundertzwanzig")
-      , (221, "zweihunderteinundzwanzig")
-      , (222, "zweihundertzweiundzwanzig")
-      , (223, "zweihundertdreiundzwanzig")
-      , (224, "zweihundertvierundzwanzig")
-      , (225, "zweihundertfünfundzwanzig")
-      , (226, "zweihundertsechsundzwanzig")
-      , (227, "zweihundertsiebenundzwanzig")
-      , (228, "zweihundertachtundzwanzig")
-      , (229, "zweihundertneunundzwanzig")
-      , (230, "zweihundertdreißig")
-      , (300, "dreihundert")
-      , (320, "dreihundertzwanzig")
-      , (400, "vierhundert")
-      , (421, "vierhunderteinundzwanzig")
-      , (500, "fünfhundert")
-      , (522, "fünfhundertzweiundzwanzig")
-      , (600, "sechshundert")
-      , (623, "sechshundertdreiundzwanzig")
-      , (700, "siebenhundert")
-      , (724, "siebenhundertvierundzwanzig")
-      , (800, "achthundert")
-      , (825, "achthundertfünfundzwanzig")
-      , (900, "neunhundert")
-      , (901, "neunhunderteins")
-      , (926, "neunhundertsechsundzwanzig")
-      , (998, "neunhundertachtundneunzig")
-      , (999, "neunhundertneunundneunzig")
-      , (1000, "tausend")
-      , (1001, "tausendeins")
-      , (1002, "tausendzwei")
-      , (1030, "tausenddreißig")
-      , (1031, "tausendeinunddreißig")
-      , (1032, "tausendzweiunddreißig")
-      , (1033, "tausenddreiunddreißig")
-      , (1034, "tausendvierunddreißig")
-      , (1035, "tausendfünfunddreißig")
-      , (1036, "tausendsechsunddreißig")
-      , (1037, "tausendsiebenunddreißig")
-      , (1038, "tausendachtunddreißig")
-      , (1039, "tausendneununddreißig")
-      , (1040, "tausendvierzig")
-      , (1041, "tausendeinundvierzig")
-      , (1042, "tausendzweiundvierzig")
-      , (1043, "tausenddreiundvierzig")
-      , (1044, "tausendvierundvierzig")
-      , (1045, "tausendfünfundvierzig")
-      , (1046, "tausendsechsundvierzig")
-      , (1047, "tausendsiebenundvierzig")
-      , (1048, "tausendachtundvierzig")
-      , (1049, "tausendneunundvierzig")
-      , (1050, "tausendfünfzig")
-      , (1051, "tausendeinundfünfzig")
-      , (1052, "tausendzweiundfünfzig")
-      , (1053, "tausenddreiundfünfzig")
-      , (1054, "tausendvierundfünfzig")
-      , (1055, "tausendfünfundfünfzig")
-      , (1056, "tausendsechsundfünfzig")
-      , (1057, "tausendsiebenundfünfzig")
-      , (1058, "tausendachtundfünfzig")
-      , (1059, "tausendneunundfünfzig")
-      , (1060, "tausendsechzig")
-      , (1061, "tausendeinundsechzig")
-      , (1062, "tausendzweiundsechzig")
-      , (1063, "tausenddreiundsechzig")
-      , (1064, "tausendvierundsechzig")
-      , (1065, "tausendfünfundsechzig")
-      , (1066, "tausendsechsundsechzig")
-      , (1067, "tausendsiebenundsechzig")
-      , (1068, "tausendachtundsechzig")
-      , (1069, "tausendneunundsechzig")
-      , (1070, "tausendsiebzig")
-      , (1071, "tausendeinundsiebzig")
-      , (1072, "tausendzweiundsiebzig")
-      , (1073, "tausenddreiundsiebzig")
-      , (1074, "tausendvierundsiebzig")
-      , (1075, "tausendfünfundsiebzig")
-      , (1076, "tausendsechsundsiebzig")
-      , (1077, "tausendsiebenundsiebzig")
-      , (1078, "tausendachtundsiebzig")
-      , (1079, "tausendneunundsiebzig")
-      , (1080, "tausendachtzig")
-      , (1081, "tausendeinundachtzig")
-      , (1082, "tausendzweiundachtzig")
-      , (1083, "tausenddreiundachtzig")
-      , (1084, "tausendvierundachtzig")
-      , (1085, "tausendfünfundachtzig")
-      , (1086, "tausendsechsundachtzig")
-      , (1087, "tausendsiebenundachtzig")
-      , (1088, "tausendachtundachtzig")
-      , (1089, "tausendneunundachtzig")
-      , (1090, "tausendneunzig")
-      , (1091, "tausendeinundneunzig")
-      , (1092, "tausendzweiundneunzig")
-      , (1093, "tausenddreiundneunzig")
-      , (1094, "tausendvierundneunzig")
-      , (1095, "tausendfünfundneunzig")
-      , (1096, "tausendsechsundneunzig")
-      , (1097, "tausendsiebenundneunzig")
-      , (1098, "tausendachtundneunzig")
-      , (1099, "tausendneunundneunzig")
-      , (1100, "tausendhundert")
-      , (1101, "tausendhunderteins")
-      , (1102, "tausendhundertzwei")
-      , (1103, "tausendhundertdrei")
-      , (1104, "tausendhundertvier")
-      , (1105, "tausendhundertfünf")
-      , (1106, "tausendhundertsechs")
-      , (1107, "tausendhundertsieben")
-      , (1108, "tausendhundertacht")
-      , (1109, "tausendhundertneun")
-      , (1210, "tausendzweihundertzehn")
-      , (1211, "tausendzweihundertelf")
-      , (1212, "tausendzweihundertzwölf")
-      , (1213, "tausendzweihundertdreizehn")
-      , (1214, "tausendzweihundertvierzehn")
-      , (1215, "tausendzweihundertfünfzehn")
-      , (1216, "tausendzweihundertsechzehn")
-      , (1217, "tausendzweihundertsiebzehn")
-      , (1218, "tausendzweihundertachtzehn")
-      , (1219, "tausendzweihundertneunzehn")
-      , (2000, "zweitausend")
-      , (2001, "zweitausendeins")
-      , (2002, "zweitausendzwei")
-      , (2004, "zweitausendvier")
-      , (9999, "neuntausendneunhundertneunundneunzig")
-      , (10000, "zehntausend")
-      , (20000, "zwanzigtausend")
-      , (dec 5, "hunderttausend")
-      , (dec 6, "million")
-      , (2 ⋅ dec 6, "zwei millionen")
-      , (dec 9, "milliarde")
-      , (6 ⋅ dec 9, "sechs milliarden")
-      , (dec 12, "billion")
-      , (dec 15, "billiarde")
-      , (dec 18, "trillion")
-      , (dec 21, "trilliarde")
-      , (dec 24, "quadrillion")
-      , (dec 27, "quadrilliarde")
-      , (dec 30, "quintillion")
-      , (dec 33, "quintilliarde")
-      , (dec 36, "sextillion")
-      , (dec 39, "sextilliarde")
-      , (dec 42, "septillion")
-      , (dec 45, "septilliarde")
-      , (dec 48, "oktillion")
-      , (dec 51, "oktilliarde")
-      , (dec 54, "nonillion")
-      , (dec 57, "nonilliarde")
-      , (dec 60, "dezillion")
-      , (dec 63, "dezilliarde")
-      , (dec 66, "undezillion")
-      , (dec 69, "undezilliarde")
-      , (dec 72, "duodezillion")
-      , (dec 75, "duodezilliarde")
-      , (dec 78, "tredezillion")
-      , (dec 81, "tredezilliarde")
-      , (dec 84, "quattuordezillion")
-      , (dec 87, "quattuordezilliarde")
-      , (dec 90, "quindezillion")
-      , (dec 93, "quindezilliarde")
-      , (dec 180, "trigintillion")
-      , (dec 600, "zentillion")
-      , (dec 603, "zentilliarde")
-      , (dec 6000, "millinillion")
-      ]
-    )
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "nullte")
-      , (1, "erste")
-      , (2, "zweite")
-      , (3, "dritte")
-      , (4, "vierte")
-      , (5, "fünfte")
-      , (6, "sechste")
-      , (7, "siebte")
-      , (8, "achte")
-      , (9, "neunte")
-      , (10, "zehnte")
-      , (11, "elfte")
-      , (12, "zwölfte")
-      , (13, "dreizehnte")
-      , (14, "vierzehnte")
-      , (15, "fünfzehnte")
-      , (16, "sechzehnte")
-      , (17, "siebzehnte")
-      , (18, "achtzehnte")
-      , (19, "neunzehnte")
-      , (20, "zwanzigste")
-      , (21, "einundzwanzigste")
-      , (22, "zweiundzwanzigste")
-      , (23, "dreiundzwanzigste")
-      , (24, "vierundzwanzigste")
-      , (25, "fünfundzwanzigste")
-      , (26, "sechsundzwanzigste")
-      , (27, "siebenundzwanzigste")
-      , (28, "achtundzwanzigste")
-      , (29, "neunundzwanzigste")
-      , (30, "dreißigste")
-      , (31, "einunddreißigste")
-      , (32, "zweiunddreißigste")
-      , (33, "dreiunddreißigste")
-      , (34, "vierunddreißigste")
-      , (35, "fünfunddreißigste")
-      , (36, "sechsunddreißigste")
-      , (37, "siebenunddreißigste")
-      , (38, "achtunddreißigste")
-      , (39, "neununddreißigste")
-      , (40, "vierzigste")
-      , (41, "einundvierzigste")
-      , (42, "zweiundvierzigste")
-      , (43, "dreiundvierzigste")
-      , (44, "vierundvierzigste")
-      , (45, "fünfundvierzigste")
-      , (46, "sechsundvierzigste")
-      , (47, "siebenundvierzigste")
-      , (48, "achtundvierzigste")
-      , (49, "neunundvierzigste")
-      , (50, "fünfzigste")
-      , (51, "einundfünfzigste")
-      , (52, "zweiundfünfzigste")
-      , (53, "dreiundfünfzigste")
-      , (54, "vierundfünfzigste")
-      , (55, "fünfundfünfzigste")
-      , (56, "sechsundfünfzigste")
-      , (57, "siebenundfünfzigste")
-      , (58, "achtundfünfzigste")
-      , (59, "neunundfünfzigste")
-      , (60, "sechzigste")
-      , (61, "einundsechzigste")
-      , (62, "zweiundsechzigste")
-      , (63, "dreiundsechzigste")
-      , (64, "vierundsechzigste")
-      , (65, "fünfundsechzigste")
-      , (66, "sechsundsechzigste")
-      , (67, "siebenundsechzigste")
-      , (68, "achtundsechzigste")
-      , (69, "neunundsechzigste")
-      , (70, "siebzigste")
-      , (71, "einundsiebzigste")
-      , (72, "zweiundsiebzigste")
-      , (73, "dreiundsiebzigste")
-      , (74, "vierundsiebzigste")
-      , (75, "fünfundsiebzigste")
-      , (76, "sechsundsiebzigste")
-      , (77, "siebenundsiebzigste")
-      , (78, "achtundsiebzigste")
-      , (79, "neunundsiebzigste")
-      , (80, "achtzigste")
-      , (81, "einundachtzigste")
-      , (82, "zweiundachtzigste")
-      , (83, "dreiundachtzigste")
-      , (84, "vierundachtzigste")
-      , (85, "fünfundachtzigste")
-      , (86, "sechsundachtzigste")
-      , (87, "siebenundachtzigste")
-      , (88, "achtundachtzigste")
-      , (89, "neunundachtzigste")
-      , (90, "neunzigste")
-      , (91, "einundneunzigste")
-      , (92, "zweiundneunzigste")
-      , (93, "dreiundneunzigste")
-      , (94, "vierundneunzigste")
-      , (95, "fünfundneunzigste")
-      , (96, "sechsundneunzigste")
-      , (97, "siebenundneunzigste")
-      , (98, "achtundneunzigste")
-      , (99, "neunundneunzigste")
-      , (100, "hundertste")
-      , (101, "hunderterste")
-      , (102, "hundertzweite")
-      , (103, "hundertdritte")
-      , (200, "zweihundertste")
-      , (201, "zweihunderterste")
-      , (202, "zweihundertzweite")
-      , (203, "zweihundertdritte")
-      , (900, "neunhundertste")
-      , (901, "neunhunderterste")
-      , (998, "neunhundertachtundneunzigste")
-      , (999, "neunhundertneunundneunzigste")
-      , (1000, "tausendste")
-      , (1001, "tausenderste")
-      , (1002, "tausendzweite")
-      , (2000, "zweitausendste")
-      , (2001, "zweitausenderste")
-      , (2002, "zweitausendzweite")
-      , (2004, "zweitausendvierte")
-      , (10000, "zehntausendste")
-      , (20000, "zwanzigtausendste")
-      , (dec 5, "hunderttausendste")
-      , (dec 6, "millionste")
-      , (2 ⋅ dec 6, "zwei millionste")
-      , (dec 9, "milliardste")
-      , (dec 12, "billionste")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/DEU/TestData.hs b/src-test/Text/Numeral/Language/DEU/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/DEU/TestData.hs
@@ -0,0 +1,467 @@
+{-|
+[@ISO639-1@]        de
+
+[@ISO639-2B@]       ger
+
+[@ISO639-2T@]       deu
+
+[@ISO639-3@]        deu
+
+[@Native name@]     Deutsch
+
+[@English name@]    German
+-}
+
+module Text.Numeral.Language.DEU.TestData (cardinals, ordinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://de.wikipedia.org/wiki/Zahlennamen
+  http://german.about.com/library/blzahlen.htm
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "null")
+      , (1, "eins")
+      , (2, "zwei")
+      , (3, "drei")
+      , (4, "vier")
+      , (5, "fünf")
+      , (6, "sechs")
+      , (7, "sieben")
+      , (8, "acht")
+      , (9, "neun")
+      , (10, "zehn")
+      , (11, "elf")
+      , (12, "zwölf")
+      , (13, "dreizehn")
+      , (14, "vierzehn")
+      , (15, "fünfzehn")
+      , (16, "sechzehn")
+      , (17, "siebzehn")
+      , (18, "achtzehn")
+      , (19, "neunzehn")
+      , (20, "zwanzig")
+      , (21, "einundzwanzig")
+      , (22, "zweiundzwanzig")
+      , (23, "dreiundzwanzig")
+      , (24, "vierundzwanzig")
+      , (25, "fünfundzwanzig")
+      , (26, "sechsundzwanzig")
+      , (27, "siebenundzwanzig")
+      , (28, "achtundzwanzig")
+      , (29, "neunundzwanzig")
+      , (30, "dreißig")
+      , (31, "einunddreißig")
+      , (32, "zweiunddreißig")
+      , (33, "dreiunddreißig")
+      , (34, "vierunddreißig")
+      , (35, "fünfunddreißig")
+      , (36, "sechsunddreißig")
+      , (37, "siebenunddreißig")
+      , (38, "achtunddreißig")
+      , (39, "neununddreißig")
+      , (40, "vierzig")
+      , (41, "einundvierzig")
+      , (42, "zweiundvierzig")
+      , (43, "dreiundvierzig")
+      , (44, "vierundvierzig")
+      , (45, "fünfundvierzig")
+      , (46, "sechsundvierzig")
+      , (47, "siebenundvierzig")
+      , (48, "achtundvierzig")
+      , (49, "neunundvierzig")
+      , (50, "fünfzig")
+      , (51, "einundfünfzig")
+      , (52, "zweiundfünfzig")
+      , (53, "dreiundfünfzig")
+      , (54, "vierundfünfzig")
+      , (55, "fünfundfünfzig")
+      , (56, "sechsundfünfzig")
+      , (57, "siebenundfünfzig")
+      , (58, "achtundfünfzig")
+      , (59, "neunundfünfzig")
+      , (60, "sechzig")
+      , (61, "einundsechzig")
+      , (62, "zweiundsechzig")
+      , (63, "dreiundsechzig")
+      , (64, "vierundsechzig")
+      , (65, "fünfundsechzig")
+      , (66, "sechsundsechzig")
+      , (67, "siebenundsechzig")
+      , (68, "achtundsechzig")
+      , (69, "neunundsechzig")
+      , (70, "siebzig")
+      , (71, "einundsiebzig")
+      , (72, "zweiundsiebzig")
+      , (73, "dreiundsiebzig")
+      , (74, "vierundsiebzig")
+      , (75, "fünfundsiebzig")
+      , (76, "sechsundsiebzig")
+      , (77, "siebenundsiebzig")
+      , (78, "achtundsiebzig")
+      , (79, "neunundsiebzig")
+      , (80, "achtzig")
+      , (81, "einundachtzig")
+      , (82, "zweiundachtzig")
+      , (83, "dreiundachtzig")
+      , (84, "vierundachtzig")
+      , (85, "fünfundachtzig")
+      , (86, "sechsundachtzig")
+      , (87, "siebenundachtzig")
+      , (88, "achtundachtzig")
+      , (89, "neunundachtzig")
+      , (90, "neunzig")
+      , (91, "einundneunzig")
+      , (92, "zweiundneunzig")
+      , (93, "dreiundneunzig")
+      , (94, "vierundneunzig")
+      , (95, "fünfundneunzig")
+      , (96, "sechsundneunzig")
+      , (97, "siebenundneunzig")
+      , (98, "achtundneunzig")
+      , (99, "neunundneunzig")
+      , (100, "hundert")
+      , (101, "hunderteins")
+      , (102, "hundertzwei")
+      , (103, "hundertdrei")
+      , (153, "hundertdreiundfünfzig")
+      , (200, "zweihundert")
+      , (201, "zweihunderteins")
+      , (202, "zweihundertzwei")
+      , (203, "zweihundertdrei")
+      , (204, "zweihundertvier")
+      , (205, "zweihundertfünf")
+      , (206, "zweihundertsechs")
+      , (207, "zweihundertsieben")
+      , (208, "zweihundertacht")
+      , (209, "zweihundertneun")
+      , (210, "zweihundertzehn")
+      , (211, "zweihundertelf")
+      , (212, "zweihundertzwölf")
+      , (213, "zweihundertdreizehn")
+      , (214, "zweihundertvierzehn")
+      , (215, "zweihundertfünfzehn")
+      , (216, "zweihundertsechzehn")
+      , (217, "zweihundertsiebzehn")
+      , (218, "zweihundertachtzehn")
+      , (219, "zweihundertneunzehn")
+      , (220, "zweihundertzwanzig")
+      , (221, "zweihunderteinundzwanzig")
+      , (222, "zweihundertzweiundzwanzig")
+      , (223, "zweihundertdreiundzwanzig")
+      , (224, "zweihundertvierundzwanzig")
+      , (225, "zweihundertfünfundzwanzig")
+      , (226, "zweihundertsechsundzwanzig")
+      , (227, "zweihundertsiebenundzwanzig")
+      , (228, "zweihundertachtundzwanzig")
+      , (229, "zweihundertneunundzwanzig")
+      , (230, "zweihundertdreißig")
+      , (300, "dreihundert")
+      , (320, "dreihundertzwanzig")
+      , (400, "vierhundert")
+      , (421, "vierhunderteinundzwanzig")
+      , (500, "fünfhundert")
+      , (522, "fünfhundertzweiundzwanzig")
+      , (600, "sechshundert")
+      , (623, "sechshundertdreiundzwanzig")
+      , (700, "siebenhundert")
+      , (724, "siebenhundertvierundzwanzig")
+      , (800, "achthundert")
+      , (825, "achthundertfünfundzwanzig")
+      , (900, "neunhundert")
+      , (901, "neunhunderteins")
+      , (926, "neunhundertsechsundzwanzig")
+      , (998, "neunhundertachtundneunzig")
+      , (999, "neunhundertneunundneunzig")
+      , (1000, "tausend")
+      , (1001, "tausendeins")
+      , (1002, "tausendzwei")
+      , (1030, "tausenddreißig")
+      , (1031, "tausendeinunddreißig")
+      , (1032, "tausendzweiunddreißig")
+      , (1033, "tausenddreiunddreißig")
+      , (1034, "tausendvierunddreißig")
+      , (1035, "tausendfünfunddreißig")
+      , (1036, "tausendsechsunddreißig")
+      , (1037, "tausendsiebenunddreißig")
+      , (1038, "tausendachtunddreißig")
+      , (1039, "tausendneununddreißig")
+      , (1040, "tausendvierzig")
+      , (1041, "tausendeinundvierzig")
+      , (1042, "tausendzweiundvierzig")
+      , (1043, "tausenddreiundvierzig")
+      , (1044, "tausendvierundvierzig")
+      , (1045, "tausendfünfundvierzig")
+      , (1046, "tausendsechsundvierzig")
+      , (1047, "tausendsiebenundvierzig")
+      , (1048, "tausendachtundvierzig")
+      , (1049, "tausendneunundvierzig")
+      , (1050, "tausendfünfzig")
+      , (1051, "tausendeinundfünfzig")
+      , (1052, "tausendzweiundfünfzig")
+      , (1053, "tausenddreiundfünfzig")
+      , (1054, "tausendvierundfünfzig")
+      , (1055, "tausendfünfundfünfzig")
+      , (1056, "tausendsechsundfünfzig")
+      , (1057, "tausendsiebenundfünfzig")
+      , (1058, "tausendachtundfünfzig")
+      , (1059, "tausendneunundfünfzig")
+      , (1060, "tausendsechzig")
+      , (1061, "tausendeinundsechzig")
+      , (1062, "tausendzweiundsechzig")
+      , (1063, "tausenddreiundsechzig")
+      , (1064, "tausendvierundsechzig")
+      , (1065, "tausendfünfundsechzig")
+      , (1066, "tausendsechsundsechzig")
+      , (1067, "tausendsiebenundsechzig")
+      , (1068, "tausendachtundsechzig")
+      , (1069, "tausendneunundsechzig")
+      , (1070, "tausendsiebzig")
+      , (1071, "tausendeinundsiebzig")
+      , (1072, "tausendzweiundsiebzig")
+      , (1073, "tausenddreiundsiebzig")
+      , (1074, "tausendvierundsiebzig")
+      , (1075, "tausendfünfundsiebzig")
+      , (1076, "tausendsechsundsiebzig")
+      , (1077, "tausendsiebenundsiebzig")
+      , (1078, "tausendachtundsiebzig")
+      , (1079, "tausendneunundsiebzig")
+      , (1080, "tausendachtzig")
+      , (1081, "tausendeinundachtzig")
+      , (1082, "tausendzweiundachtzig")
+      , (1083, "tausenddreiundachtzig")
+      , (1084, "tausendvierundachtzig")
+      , (1085, "tausendfünfundachtzig")
+      , (1086, "tausendsechsundachtzig")
+      , (1087, "tausendsiebenundachtzig")
+      , (1088, "tausendachtundachtzig")
+      , (1089, "tausendneunundachtzig")
+      , (1090, "tausendneunzig")
+      , (1091, "tausendeinundneunzig")
+      , (1092, "tausendzweiundneunzig")
+      , (1093, "tausenddreiundneunzig")
+      , (1094, "tausendvierundneunzig")
+      , (1095, "tausendfünfundneunzig")
+      , (1096, "tausendsechsundneunzig")
+      , (1097, "tausendsiebenundneunzig")
+      , (1098, "tausendachtundneunzig")
+      , (1099, "tausendneunundneunzig")
+      , (1100, "tausendhundert")
+      , (1101, "tausendhunderteins")
+      , (1102, "tausendhundertzwei")
+      , (1103, "tausendhundertdrei")
+      , (1104, "tausendhundertvier")
+      , (1105, "tausendhundertfünf")
+      , (1106, "tausendhundertsechs")
+      , (1107, "tausendhundertsieben")
+      , (1108, "tausendhundertacht")
+      , (1109, "tausendhundertneun")
+      , (1210, "tausendzweihundertzehn")
+      , (1211, "tausendzweihundertelf")
+      , (1212, "tausendzweihundertzwölf")
+      , (1213, "tausendzweihundertdreizehn")
+      , (1214, "tausendzweihundertvierzehn")
+      , (1215, "tausendzweihundertfünfzehn")
+      , (1216, "tausendzweihundertsechzehn")
+      , (1217, "tausendzweihundertsiebzehn")
+      , (1218, "tausendzweihundertachtzehn")
+      , (1219, "tausendzweihundertneunzehn")
+      , (2000, "zweitausend")
+      , (2001, "zweitausendeins")
+      , (2002, "zweitausendzwei")
+      , (2004, "zweitausendvier")
+      , (9999, "neuntausendneunhundertneunundneunzig")
+      , (10000, "zehntausend")
+      , (20000, "zwanzigtausend")
+      , (dec 5, "hunderttausend")
+      , (dec 6, "million")
+      , (2 * dec 6, "zwei millionen")
+      , (dec 9, "milliarde")
+      , (6 * dec 9, "sechs milliarden")
+      , (dec 12, "billion")
+      , (dec 15, "billiarde")
+      , (dec 18, "trillion")
+      , (dec 21, "trilliarde")
+      , (dec 24, "quadrillion")
+      , (dec 27, "quadrilliarde")
+      , (dec 30, "quintillion")
+      , (dec 33, "quintilliarde")
+      , (dec 36, "sextillion")
+      , (dec 39, "sextilliarde")
+      , (dec 42, "septillion")
+      , (dec 45, "septilliarde")
+      , (dec 48, "oktillion")
+      , (dec 51, "oktilliarde")
+      , (dec 54, "nonillion")
+      , (dec 57, "nonilliarde")
+      , (dec 60, "dezillion")
+      , (dec 63, "dezilliarde")
+      , (dec 66, "undezillion")
+      , (dec 69, "undezilliarde")
+      , (dec 72, "duodezillion")
+      , (dec 75, "duodezilliarde")
+      , (dec 78, "tredezillion")
+      , (dec 81, "tredezilliarde")
+      , (dec 84, "quattuordezillion")
+      , (dec 87, "quattuordezilliarde")
+      , (dec 90, "quindezillion")
+      , (dec 93, "quindezilliarde")
+      , (dec 180, "trigintillion")
+      , (dec 600, "zentillion")
+      , (dec 603, "zentilliarde")
+      , (dec 6000, "millinillion")
+      ]
+    )
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "nullte")
+      , (1, "erste")
+      , (2, "zweite")
+      , (3, "dritte")
+      , (4, "vierte")
+      , (5, "fünfte")
+      , (6, "sechste")
+      , (7, "siebte")
+      , (8, "achte")
+      , (9, "neunte")
+      , (10, "zehnte")
+      , (11, "elfte")
+      , (12, "zwölfte")
+      , (13, "dreizehnte")
+      , (14, "vierzehnte")
+      , (15, "fünfzehnte")
+      , (16, "sechzehnte")
+      , (17, "siebzehnte")
+      , (18, "achtzehnte")
+      , (19, "neunzehnte")
+      , (20, "zwanzigste")
+      , (21, "einundzwanzigste")
+      , (22, "zweiundzwanzigste")
+      , (23, "dreiundzwanzigste")
+      , (24, "vierundzwanzigste")
+      , (25, "fünfundzwanzigste")
+      , (26, "sechsundzwanzigste")
+      , (27, "siebenundzwanzigste")
+      , (28, "achtundzwanzigste")
+      , (29, "neunundzwanzigste")
+      , (30, "dreißigste")
+      , (31, "einunddreißigste")
+      , (32, "zweiunddreißigste")
+      , (33, "dreiunddreißigste")
+      , (34, "vierunddreißigste")
+      , (35, "fünfunddreißigste")
+      , (36, "sechsunddreißigste")
+      , (37, "siebenunddreißigste")
+      , (38, "achtunddreißigste")
+      , (39, "neununddreißigste")
+      , (40, "vierzigste")
+      , (41, "einundvierzigste")
+      , (42, "zweiundvierzigste")
+      , (43, "dreiundvierzigste")
+      , (44, "vierundvierzigste")
+      , (45, "fünfundvierzigste")
+      , (46, "sechsundvierzigste")
+      , (47, "siebenundvierzigste")
+      , (48, "achtundvierzigste")
+      , (49, "neunundvierzigste")
+      , (50, "fünfzigste")
+      , (51, "einundfünfzigste")
+      , (52, "zweiundfünfzigste")
+      , (53, "dreiundfünfzigste")
+      , (54, "vierundfünfzigste")
+      , (55, "fünfundfünfzigste")
+      , (56, "sechsundfünfzigste")
+      , (57, "siebenundfünfzigste")
+      , (58, "achtundfünfzigste")
+      , (59, "neunundfünfzigste")
+      , (60, "sechzigste")
+      , (61, "einundsechzigste")
+      , (62, "zweiundsechzigste")
+      , (63, "dreiundsechzigste")
+      , (64, "vierundsechzigste")
+      , (65, "fünfundsechzigste")
+      , (66, "sechsundsechzigste")
+      , (67, "siebenundsechzigste")
+      , (68, "achtundsechzigste")
+      , (69, "neunundsechzigste")
+      , (70, "siebzigste")
+      , (71, "einundsiebzigste")
+      , (72, "zweiundsiebzigste")
+      , (73, "dreiundsiebzigste")
+      , (74, "vierundsiebzigste")
+      , (75, "fünfundsiebzigste")
+      , (76, "sechsundsiebzigste")
+      , (77, "siebenundsiebzigste")
+      , (78, "achtundsiebzigste")
+      , (79, "neunundsiebzigste")
+      , (80, "achtzigste")
+      , (81, "einundachtzigste")
+      , (82, "zweiundachtzigste")
+      , (83, "dreiundachtzigste")
+      , (84, "vierundachtzigste")
+      , (85, "fünfundachtzigste")
+      , (86, "sechsundachtzigste")
+      , (87, "siebenundachtzigste")
+      , (88, "achtundachtzigste")
+      , (89, "neunundachtzigste")
+      , (90, "neunzigste")
+      , (91, "einundneunzigste")
+      , (92, "zweiundneunzigste")
+      , (93, "dreiundneunzigste")
+      , (94, "vierundneunzigste")
+      , (95, "fünfundneunzigste")
+      , (96, "sechsundneunzigste")
+      , (97, "siebenundneunzigste")
+      , (98, "achtundneunzigste")
+      , (99, "neunundneunzigste")
+      , (100, "hundertste")
+      , (101, "hunderterste")
+      , (102, "hundertzweite")
+      , (103, "hundertdritte")
+      , (200, "zweihundertste")
+      , (201, "zweihunderterste")
+      , (202, "zweihundertzweite")
+      , (203, "zweihundertdritte")
+      , (900, "neunhundertste")
+      , (901, "neunhunderterste")
+      , (998, "neunhundertachtundneunzigste")
+      , (999, "neunhundertneunundneunzigste")
+      , (1000, "tausendste")
+      , (1001, "tausenderste")
+      , (1002, "tausendzweite")
+      , (2000, "zweitausendste")
+      , (2001, "zweitausenderste")
+      , (2002, "zweitausendzweite")
+      , (2004, "zweitausendvierte")
+      , (10000, "zehntausendste")
+      , (20000, "zwanzigtausendste")
+      , (dec 5, "hunderttausendste")
+      , (dec 6, "millionste")
+      , (2 * dec 6, "zwei millionste")
+      , (dec 9, "milliardste")
+      , (dec 12, "billionste")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/DJK/TestData.hs b/src-test/Text/Numeral/Language/DJK/TestData.hs
--- a/src-test/Text/Numeral/Language/DJK/TestData.hs
+++ b/src-test/Text/Numeral/Language/DJK/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-aukan/en/djk/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/EKK/TestData.hs b/src-test/Text/Numeral/Language/EKK/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/EKK/TestData.hs
@@ -0,0 +1,214 @@
+{-|
+[@ISO639-1@]        et
+
+[@ISO639-2@]        est
+
+[@ISO639-3@]        ekk
+
+[@Native name@]     eesti keel
+
+[@English name@]    Estonian
+-}
+
+module Text.Numeral.Language.EKK.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Prelude ( Integral )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "null")
+      , (1, "üks")
+      , (2, "kaks")
+      , (3, "kolm")
+      , (4, "neli")
+      , (5, "viis")
+      , (6, "kuus")
+      , (7, "seitse")
+      , (8, "kaheksa")
+      , (9, "üheksa")
+      , (10, "kümme")
+      , (11, "üksteist")
+      , (12, "kaksteist")
+      , (13, "kolmteist")
+      , (14, "neliteist")
+      , (15, "viisteist")
+      , (16, "kuusteist")
+      , (17, "seitseteist")
+      , (18, "kaheksateist")
+      , (19, "üheksateist")
+      , (20, "kakskümmend")
+      , (21, "kakskümmend üks")
+      , (22, "kakskümmend kaks")
+      , (23, "kakskümmend kolm")
+      , (24, "kakskümmend neli")
+      , (25, "kakskümmend viis")
+      , (26, "kakskümmend kuus")
+      , (27, "kakskümmend seitse")
+      , (28, "kakskümmend kaheksa")
+      , (29, "kakskümmend üheksa")
+      , (30, "kolmkümmend")
+      , (31, "kolmkümmend üks")
+      , (32, "kolmkümmend kaks")
+      , (33, "kolmkümmend kolm")
+      , (34, "kolmkümmend neli")
+      , (35, "kolmkümmend viis")
+      , (36, "kolmkümmend kuus")
+      , (37, "kolmkümmend seitse")
+      , (38, "kolmkümmend kaheksa")
+      , (39, "kolmkümmend üheksa")
+      , (40, "nelikümmend")
+      , (41, "nelikümmend üks")
+      , (42, "nelikümmend kaks")
+      , (43, "nelikümmend kolm")
+      , (44, "nelikümmend neli")
+      , (45, "nelikümmend viis")
+      , (46, "nelikümmend kuus")
+      , (47, "nelikümmend seitse")
+      , (48, "nelikümmend kaheksa")
+      , (49, "nelikümmend üheksa")
+      , (50, "viiskümmend")
+      , (51, "viiskümmend üks")
+      , (52, "viiskümmend kaks")
+      , (53, "viiskümmend kolm")
+      , (54, "viiskümmend neli")
+      , (55, "viiskümmend viis")
+      , (56, "viiskümmend kuus")
+      , (57, "viiskümmend seitse")
+      , (58, "viiskümmend kaheksa")
+      , (59, "viiskümmend üheksa")
+      , (61, "kuuskümmend üks")
+      , (62, "kuuskümmend kaks")
+      , (63, "kuuskümmend kolm")
+      , (64, "kuuskümmend neli")
+      , (65, "kuuskümmend viis")
+      , (66, "kuuskümmend kuus")
+      , (67, "kuuskümmend seitse")
+      , (68, "kuuskümmend kaheksa")
+      , (69, "kuuskümmend üheksa")
+      , (71, "seitsekümmend üks")
+      , (72, "seitsekümmend kaks")
+      , (73, "seitsekümmend kolm")
+      , (74, "seitsekümmend neli")
+      , (75, "seitsekümmend viis")
+      , (76, "seitsekümmend kuus")
+      , (77, "seitsekümmend seitse")
+      , (78, "seitsekümmend kaheksa")
+      , (79, "seitsekümmend üheksa")
+      , (81, "kaheksakümmend üks")
+      , (82, "kaheksakümmend kaks")
+      , (83, "kaheksakümmend kolm")
+      , (84, "kaheksakümmend neli")
+      , (85, "kaheksakümmend viis")
+      , (86, "kaheksakümmend kuus")
+      , (87, "kaheksakümmend seitse")
+      , (88, "kaheksakümmend kaheksa")
+      , (89, "kaheksakümmend üheksa")
+      , (91, "üheksakümmend üks")
+      , (92, "üheksakümmend kaks")
+      , (93, "üheksakümmend kolm")
+      , (94, "üheksakümmend neli")
+      , (95, "üheksakümmend viis")
+      , (96, "üheksakümmend kuus")
+      , (97, "üheksakümmend seitse")
+      , (98, "üheksakümmend kaheksa")
+      , (99, "üheksakümmend üheksa")
+      , (100, "sada")
+      , (101, "sadaüks")
+      , (102, "sadakaks")
+      , (103, "sadakolm")
+      , (104, "sadaneli")
+      , (105, "sadaviis")
+      , (106, "sadakuus")
+      , (107, "sadaseitse")
+      , (108, "sadakaheksa")
+      , (109, "sadaüheksa")
+      , (110, "sadakümme")
+      , (123, "sadakakskümmend kolm")
+      , (200, "kakssada")
+      , (300, "kolmsada")
+      , (321, "kolmsadakakskümmend üks")
+      , (400, "nelisada")
+      , (500, "viissada")
+      , (600, "kuussada")
+      , (700, "seitsesada")
+      , (800, "kaheksasada")
+      , (900, "üheksasada")
+      , (909, "üheksasadaüheksa")
+      , (990, "üheksasadaüheksakümmend")
+      , (999, "üheksasadaüheksakümmend üheksa")
+      , (1000, "tuhat")
+      , (1001, "tuhatüks")
+      , (1008, "tuhatkaheksa")
+      , (1234, "tuhatkakssadakolmkümmend neli")
+      , (2000, "kaks tuhat")
+      , (3000, "kolm tuhat")
+      , (4000, "neli tuhat")
+      , (4321, "neli tuhatkolmsadakakskümmend üks")
+      , (5000, "viis tuhat")
+      , (6000, "kuus tuhat")
+      , (7000, "seitse tuhat")
+      , (8000, "kaheksa tuhat")
+      , (9000, "üheksa tuhat")
+      , (10000, "kümme tuhat")
+      , (12345, "kaksteist tuhatkolmsadanelikümmend viis")
+      , (20000, "kakskümmend tuhat")
+      , (30000, "kolmkümmend tuhat")
+      , (40000, "nelikümmend tuhat")
+      , (50000, "viiskümmend tuhat")
+      , (54321, "viiskümmend neli tuhatkolmsadakakskümmend üks")
+      , (60000, "kuuskümmend tuhat")
+      , (70000, "seitsekümmend tuhat")
+      , (80000, "kaheksakümmend tuhat")
+      , (90000, "üheksakümmend tuhat")
+      , (100000, "sada tuhat")
+      , (123456, "sadakakskümmend kolm tuhatnelisadaviiskümmend kuus")
+      , (200000, "kakssada tuhat")
+      , (300000, "kolmsada tuhat")
+      , (400000, "nelisada tuhat")
+      , (500000, "viissada tuhat")
+      , (600000, "kuussada tuhat")
+      , (654321, "kuussadaviiskümmend neli tuhatkolmsadakakskümmend üks")
+      , (700000, "seitsesada tuhat")
+      , (800000, "kaheksasada tuhat")
+      , (900000, "üheksasada tuhat")
+      , (1000000, "miljon")
+      , (1000001, "miljonüks")
+      , (1234567, "miljonkakssadakolmkümmend neli tuhatviissadakuuskümmend seitse")
+      , (2000000, "kaks miljonit")
+      , (3000000, "kolm miljonit")
+      , (4000000, "neli miljonit")
+      , (5000000, "viis miljonit")
+      , (6000000, "kuus miljonit")
+      , (7000000, "seitse miljonit")
+      , (7654321, "seitse miljonitkuussadaviiskümmend neli tuhatkolmsadakakskümmend üks")
+      , (8000000, "kaheksa miljonit")
+      , (9000000, "üheksa miljonit")
+      , (1000000000, "miljard")
+      , (1000000001, "miljardüks")
+      , (2000000000, "kaks miljard")
+      , (3000000000, "kolm miljard")
+      , (4000000000, "neli miljard")
+      , (5000000000, "viis miljard")
+      , (6000000000, "kuus miljard")
+      , (7000000000, "seitse miljard")
+      , (8000000000, "kaheksa miljard")
+      , (9000000000, "üheksa miljard")
+      , (1000000000000, "triljon")
+      , (1000000000001, "triljonüks")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/EMI/TestData.hs b/src-test/Text/Numeral/Language/EMI/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/EMI/TestData.hs
@@ -0,0 +1,174 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        emi
+
+[@Native name@]     -
+
+[@English name@]    Mussau-Emira
+-}
+module Text.Numeral.Language.EMI.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-mussau-emira/en/emi/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "sesa")
+      , (2, "lua")
+      , (3, "tolu")
+      , (4, "ata")
+      , (5, "lima")
+      , (6, "nomo")
+      , (7, "itu")
+      , (8, "oalu")
+      , (9, "sio")
+      , (10, "sangaulu")
+      , (11, "sangaulu sesa")
+      , (12, "sangaulu lua")
+      , (13, "sangaulu tolu")
+      , (14, "sangaulu ata")
+      , (15, "sangaulu lima")
+      , (16, "sangaulu nomo")
+      , (17, "sangaulu itu")
+      , (18, "sangaulu oalu")
+      , (19, "sangaulu sio")
+      , (20, "luengaulu")
+      , (21, "luengaulu sesa")
+      , (22, "luengaulu lua")
+      , (23, "luengaulu tolu")
+      , (24, "luengaulu ata")
+      , (25, "luengaulu lima")
+      , (26, "luengaulu nomo")
+      , (27, "luengaulu itu")
+      , (28, "luengaulu oalu")
+      , (29, "luengaulu sio")
+      , (30, "tolungaulu")
+      , (31, "tolungaulu sesa")
+      , (32, "tolungaulu lua")
+      , (33, "tolungaulu tolu")
+      , (34, "tolungaulu ata")
+      , (35, "tolungaulu lima")
+      , (36, "tolungaulu nomo")
+      , (37, "tolungaulu itu")
+      , (38, "tolungaulu oalu")
+      , (39, "tolungaulu sio")
+      , (40, "atingaulu")
+      , (41, "atingaulu sesa")
+      , (42, "atingaulu lua")
+      , (43, "atingaulu tolu")
+      , (44, "atingaulu ata")
+      , (45, "atingaulu lima")
+      , (46, "atingaulu nomo")
+      , (47, "atingaulu itu")
+      , (48, "atingaulu oalu")
+      , (49, "atingaulu sio")
+      , (50, "limangaulu")
+      , (51, "limangaulu sesa")
+      , (52, "limangaulu lua")
+      , (53, "limangaulu tolu")
+      , (54, "limangaulu ata")
+      , (55, "limangaulu lima")
+      , (56, "limangaulu nomo")
+      , (57, "limangaulu itu")
+      , (58, "limangaulu oalu")
+      , (59, "limangaulu sio")
+      , (60, "nomongaulu")
+      , (61, "nomongaulu sesa")
+      , (62, "nomongaulu lua")
+      , (63, "nomongaulu tolu")
+      , (64, "nomongaulu ata")
+      , (65, "nomongaulu lima")
+      , (66, "nomongaulu nomo")
+      , (67, "nomongaulu itu")
+      , (68, "nomongaulu oalu")
+      , (69, "nomongaulu sio")
+      , (70, "itungaulu")
+      , (71, "itungaulu sesa")
+      , (72, "itungaulu lua")
+      , (73, "itungaulu tolu")
+      , (74, "itungaulu ata")
+      , (75, "itungaulu lima")
+      , (76, "itungaulu nomo")
+      , (77, "itungaulu itu")
+      , (78, "itungaulu oalu")
+      , (79, "itungaulu sio")
+      , (80, "oalungaulu")
+      , (81, "oalungaulu sesa")
+      , (82, "oalungaulu lua")
+      , (83, "oalungaulu tolu")
+      , (84, "oalungaulu ata")
+      , (85, "oalungaulu lima")
+      , (86, "oalungaulu nomo")
+      , (87, "oalungaulu itu")
+      , (88, "oalungaulu oalu")
+      , (89, "oalungaulu sio")
+      , (90, "siongaulu")
+      , (91, "siongaulu sesa")
+      , (92, "siongaulu lua")
+      , (93, "siongaulu tolu")
+      , (94, "siongaulu ata")
+      , (95, "siongaulu lima")
+      , (96, "siongaulu nomo")
+      , (97, "siongaulu itu")
+      , (98, "siongaulu oalu")
+      , (99, "siongaulu sio")
+      , (100, "ai")
+      , (101, "ai sesa")
+      , (102, "ai lua")
+      , (103, "ai tolu")
+      , (104, "ai ata")
+      , (105, "ai lima")
+      , (106, "ai nomo")
+      , (107, "ai itu")
+      , (108, "ai oalu")
+      , (109, "ai sio")
+      , (110, "ai sangaulu")
+      , (123, "ai luengaulu tolu")
+      , (200, "lua ai")
+      , (300, "tolu ai")
+      , (321, "tolu ai luengaulu sesa")
+      , (400, "ata ai")
+      , (500, "lima ai")
+      , (600, "nomo ai")
+      , (700, "itu ai")
+      , (800, "oalu ai")
+      , (900, "sio ai")
+      , (909, "sio ai sio")
+      , (990, "sio ai siongaulu")
+      , (999, "sio ai siongaulu sio")
+      , (1000, "airari")
+      , (1001, "airari sesa")
+      , (1008, "airari oalu")
+      , (1234, "airari lua ai tolungaulu ata")
+      , (2000, "lua airari")
+      , (3000, "tolu airari")
+      , (4000, "ata airari")
+      , (4321, "ata airari tolu ai luengaulu sesa")
+      , (5000, "lima airari")
+      , (6000, "nomo airari")
+      , (7000, "itu airari")
+      , (8000, "oalu airari")
+      , (9000, "sio airari")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/EN/TestData.hs b/src-test/Text/Numeral/Language/EN/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/EN/TestData.hs
+++ /dev/null
@@ -1,380 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        en
-
-[@ISO639-2B@]       eng
-
-[@ISO639-3@]        eng
-
-[@Native name@]     English
-
-[@English name@]    English
--}
-
-module Text.Numeral.Language.EN.TestData
-    ( gb_cardinals, gb_ordinals
-    , us_cardinals, us_ordinals
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Num )
-import "base-unicode-symbols" Data.Monoid.Unicode ( (⊕) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
--- Sources: http://en.wikipedia.org/wiki/List_of_numbers
-
-en_cardinals ∷ (Num i) ⇒ [(i, Text)]
-en_cardinals =
-  [ (0, "zero")
-  , (1, "one")
-  , (2, "two")
-  , (3, "three")
-  , (4, "four")
-  , (5, "five")
-  , (6, "six")
-  , (7, "seven")
-  , (8, "eight")
-  , (9, "nine")
-  , (10, "ten")
-  , (11, "eleven")
-  , (12, "twelve")
-  , (13, "thirteen")
-  , (14, "fourteen")
-  , (15, "fifteen")
-  , (16, "sixteen")
-  , (17, "seventeen")
-  , (18, "eighteen")
-  , (19, "nineteen")
-  , (20, "twenty")
-  , (21, "twenty-one")
-  , (22, "twenty-two")
-  , (23, "twenty-three")
-  , (24, "twenty-four")
-  , (25, "twenty-five")
-  , (26, "twenty-six")
-  , (27, "twenty-seven")
-  , (28, "twenty-eight")
-  , (29, "twenty-nine")
-  , (30, "thirty")
-  , (31, "thirty-one")
-  , (32, "thirty-two")
-  , (33, "thirty-three")
-  , (34, "thirty-four")
-  , (35, "thirty-five")
-  , (36, "thirty-six")
-  , (37, "thirty-seven")
-  , (38, "thirty-eight")
-  , (39, "thirty-nine")
-  , (40, "forty")
-  , (41, "forty-one")
-  , (42, "forty-two")
-  , (43, "forty-three")
-  , (44, "forty-four")
-  , (45, "forty-five")
-  , (46, "forty-six")
-  , (47, "forty-seven")
-  , (48, "forty-eight")
-  , (49, "forty-nine")
-  , (50, "fifty")
-  , (51, "fifty-one")
-  , (52, "fifty-two")
-  , (53, "fifty-three")
-  , (54, "fifty-four")
-  , (55, "fifty-five")
-  , (56, "fifty-six")
-  , (57, "fifty-seven")
-  , (58, "fifty-eight")
-  , (59, "fifty-nine")
-  , (60, "sixty")
-  , (61, "sixty-one")
-  , (62, "sixty-two")
-  , (63, "sixty-three")
-  , (64, "sixty-four")
-  , (65, "sixty-five")
-  , (66, "sixty-six")
-  , (67, "sixty-seven")
-  , (68, "sixty-eight")
-  , (69, "sixty-nine")
-  , (70, "seventy")
-  , (71, "seventy-one")
-  , (72, "seventy-two")
-  , (73, "seventy-three")
-  , (74, "seventy-four")
-  , (75, "seventy-five")
-  , (76, "seventy-six")
-  , (77, "seventy-seven")
-  , (78, "seventy-eight")
-  , (79, "seventy-nine")
-  , (80, "eighty")
-  , (81, "eighty-one")
-  , (82, "eighty-two")
-  , (83, "eighty-three")
-  , (84, "eighty-four")
-  , (85, "eighty-five")
-  , (86, "eighty-six")
-  , (87, "eighty-seven")
-  , (88, "eighty-eight")
-  , (89, "eighty-nine")
-  , (90, "ninety")
-  , (91, "ninety-one")
-  , (92, "ninety-two")
-  , (93, "ninety-three")
-  , (94, "ninety-four")
-  , (95, "ninety-five")
-  , (96, "ninety-six")
-  , (97, "ninety-seven")
-  , (98, "ninety-eight")
-  , (99, "ninety-nine")
-  , (100, "one hundred")
-  ]
-
-en_ordinals ∷ (Num i) ⇒ [(i, Text)]
-en_ordinals =
-  [ (0, "zeroth")
-  , (1, "first")
-  , (2, "second")
-  , (3, "third")
-  , (4, "fourth")
-  , (5, "fifth")
-  , (6, "sixth")
-  , (7, "seventh")
-  , (8, "eighth")
-  , (9, "ninth")
-  , (10, "tenth")
-  , (11, "eleventh")
-  , (12, "twelfth")
-  , (13, "thirteenth")
-  , (14, "fourteenth")
-  , (15, "fifteenth")
-  , (16, "sixteenth")
-  , (17, "seventeenth")
-  , (18, "eighteenth")
-  , (19, "nineteenth")
-  , (20, "twentieth")
-  , (21, "twenty-first")
-  , (22, "twenty-second")
-  , (23, "twenty-third")
-  , (24, "twenty-fourth")
-  , (25, "twenty-fifth")
-  , (26, "twenty-sixth")
-  , (27, "twenty-seventh")
-  , (28, "twenty-eighth")
-  , (29, "twenty-ninth")
-  , (30, "thirtieth")
-  , (31, "thirty-first")
-  , (32, "thirty-second")
-  , (33, "thirty-third")
-  , (34, "thirty-fourth")
-  , (35, "thirty-fifth")
-  , (36, "thirty-sixth")
-  , (37, "thirty-seventh")
-  , (38, "thirty-eighth")
-  , (39, "thirty-ninth")
-  , (40, "fortieth")
-  , (41, "forty-first")
-  , (42, "forty-second")
-  , (43, "forty-third")
-  , (44, "forty-fourth")
-  , (45, "forty-fifth")
-  , (46, "forty-sixth")
-  , (47, "forty-seventh")
-  , (48, "forty-eighth")
-  , (49, "forty-ninth")
-  , (50, "fiftieth")
-  , (51, "fifty-first")
-  , (52, "fifty-second")
-  , (53, "fifty-third")
-  , (54, "fifty-fourth")
-  , (55, "fifty-fifth")
-  , (56, "fifty-sixth")
-  , (57, "fifty-seventh")
-  , (58, "fifty-eighth")
-  , (59, "fifty-ninth")
-  , (60, "sixtieth")
-  , (61, "sixty-first")
-  , (62, "sixty-second")
-  , (63, "sixty-third")
-  , (64, "sixty-fourth")
-  , (65, "sixty-fifth")
-  , (66, "sixty-sixth")
-  , (67, "sixty-seventh")
-  , (68, "sixty-eighth")
-  , (69, "sixty-ninth")
-  , (70, "seventieth")
-  , (71, "seventy-first")
-  , (72, "seventy-second")
-  , (73, "seventy-third")
-  , (74, "seventy-fourth")
-  , (75, "seventy-fifth")
-  , (76, "seventy-sixth")
-  , (77, "seventy-seventh")
-  , (78, "seventy-eighth")
-  , (79, "seventy-ninth")
-  , (80, "eightieth")
-  , (81, "eighty-first")
-  , (82, "eighty-second")
-  , (83, "eighty-third")
-  , (84, "eighty-fourth")
-  , (85, "eighty-fifth")
-  , (86, "eighty-sixth")
-  , (87, "eighty-seventh")
-  , (88, "eighty-eighth")
-  , (89, "eighty-ninth")
-  , (90, "ninetieth")
-  , (91, "ninety-first")
-  , (92, "ninety-second")
-  , (93, "ninety-third")
-  , (94, "ninety-fourth")
-  , (95, "ninety-fifth")
-  , (96, "ninety-sixth")
-  , (97, "ninety-seventh")
-  , (98, "ninety-eighth")
-  , (99, "ninety-ninth")
-  , (100, "one hundreth")
-  ]
-
-gb_cardinals ∷ (Num i) ⇒ TestData i
-gb_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , en_cardinals
-      ⊕ [ (-1, "minus one")
-        , (101, "one hundred and one")
-        , (110, "one hundred and ten")
-        , (111, "one hundred and eleven")
-        , (120, "one hundred and twenty")
-        , (121, "one hundred and twenty-one")
-        , (144, "one hundred and forty-four")
-        , (200, "two hundred")
-        , (300, "three hundred")
-        , (666, "six hundred and sixty-six")
-        , (1000, "one thousand")
-        , (1001, "one thousand and one")
-        , (1010, "one thousand and ten")
-        , (1011, "one thousand and eleven")
-        , (1024, "one thousand and twenty-four")
-        , (1100, "one thousand one hundred")
-        , (1728, "one thousand seven hundred and twenty-eight")
-        , (2000, "two thousand")
-        , (10000, "ten thousand")
-        , (100000, "one hundred thousand")
-        , (500000, "five hundred thousand")
-        , (1000000, "one million")
-        , (1048576, "one million forty-eight thousand five hundred and seventy-six")
-        , (10000000, "ten million")
-        ]
-    )
-  ]
-
-gb_ordinals ∷ (Num i) ⇒ TestData i
-gb_ordinals =
-  [ ( "default"
-    , defaultInflection
-    , en_ordinals
-      ⊕ [ (101, "one hundred and first")
-        , (110, "one hundred and tenth")
-        , (111, "one hundred and eleventh")
-        , (120, "one hundred and twentieth")
-        , (121, "one hundred and twenty-first")
-        , (144, "one hundred and forty-fourth")
-        , (200, "two hundreth")
-        , (300, "three hundreth")
-        , (666, "six hundred and sixty-sixth")
-        , (1000, "one thousandth")
-        , (1001, "one thousand and first")
-        , (1010, "one thousand and tenth")
-        , (1011, "one thousand and eleventh")
-        , (1024, "one thousand and twenty-fourth")
-        , (1100, "one thousand one hundreth")
-        , (1728, "one thousand seven hundred and twenty-eighth")
-        , (2000, "two thousandth")
-        , (10000, "ten thousandth")
-        , (100000, "one hundred thousandth")
-        , (500000, "five hundred thousandth")
-        , (1000000, "one millionth")
-        , (1048576, "one million forty-eight thousand five hundred and seventy-sixth")
-        , (10000000, "ten millionth")
-        ]
-    )
-  ]
-
-us_cardinals ∷ (Num i) ⇒ TestData i
-us_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , en_cardinals
-      ⊕ [ (-1, "negative one")
-        , (101, "one hundred one")
-        , (110, "one hundred ten")
-        , (111, "one hundred eleven")
-        , (120, "one hundred twenty")
-        , (121, "one hundred twenty-one")
-        , (144, "one hundred forty-four")
-        , (200, "two hundred")
-        , (300, "three hundred")
-        , (666, "six hundred sixty-six")
-        , (1000, "one thousand")
-        , (1001, "one thousand one")
-        , (1010, "one thousand ten")
-        , (1011, "one thousand eleven")
-        , (1024, "one thousand twenty-four")
-        , (1100, "one thousand one hundred")
-        , (1728, "one thousand seven hundred twenty-eight")
-        , (2000, "two thousand")
-        , (10000, "ten thousand")
-        , (100000, "one hundred thousand")
-        , (500000, "five hundred thousand")
-        , (1000000, "one million")
-        , (1048576, "one million forty-eight thousand five hundred seventy-six")
-        , (10000000, "ten million")
-        ]
-    )
-  ]
-
-us_ordinals ∷ (Num i) ⇒ TestData i
-us_ordinals =
-  [ ( "default"
-    , defaultInflection
-    , en_ordinals
-      ⊕ [ (101, "one hundred first")
-        , (110, "one hundred tenth")
-        , (111, "one hundred eleventh")
-        , (120, "one hundred twentieth")
-        , (121, "one hundred twenty-first")
-        , (144, "one hundred forty-fourth")
-        , (200, "two hundreth")
-        , (300, "three hundreth")
-        , (666, "six hundred sixty-sixth")
-        , (1000, "one thousandth")
-        , (1001, "one thousand first")
-        , (1010, "one thousand tenth")
-        , (1011, "one thousand eleventh")
-        , (1024, "one thousand twenty-fourth")
-        , (1100, "one thousand one hundreth")
-        , (1728, "one thousand seven hundred twenty-eighth")
-        , (2000, "two thousandth")
-        , (10000, "ten thousandth")
-        , (100000, "one hundred thousandth")
-        , (500000, "five hundred thousandth")
-        , (1000000, "one millionth")
-        , (1048576, "one million forty-eight thousand five hundred seventy-sixth")
-        , (10000000, "ten millionth")
-        ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/ENG/TestData.hs b/src-test/Text/Numeral/Language/ENG/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/ENG/TestData.hs
@@ -0,0 +1,373 @@
+{-|
+[@ISO639-1@]        en
+
+[@ISO639-2B@]       eng
+
+[@ISO639-3@]        eng
+
+[@Native name@]     English
+
+[@English name@]    English
+-}
+
+module Text.Numeral.Language.ENG.TestData
+    ( gb_cardinals, gb_ordinals
+    , us_cardinals, us_ordinals
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Monoid ( (<>) )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+-- Sources: http://en.wikipedia.org/wiki/List_of_numbers
+
+en_cardinals :: (Num i) => [(i, Text)]
+en_cardinals =
+  [ (0, "zero")
+  , (1, "one")
+  , (2, "two")
+  , (3, "three")
+  , (4, "four")
+  , (5, "five")
+  , (6, "six")
+  , (7, "seven")
+  , (8, "eight")
+  , (9, "nine")
+  , (10, "ten")
+  , (11, "eleven")
+  , (12, "twelve")
+  , (13, "thirteen")
+  , (14, "fourteen")
+  , (15, "fifteen")
+  , (16, "sixteen")
+  , (17, "seventeen")
+  , (18, "eighteen")
+  , (19, "nineteen")
+  , (20, "twenty")
+  , (21, "twenty-one")
+  , (22, "twenty-two")
+  , (23, "twenty-three")
+  , (24, "twenty-four")
+  , (25, "twenty-five")
+  , (26, "twenty-six")
+  , (27, "twenty-seven")
+  , (28, "twenty-eight")
+  , (29, "twenty-nine")
+  , (30, "thirty")
+  , (31, "thirty-one")
+  , (32, "thirty-two")
+  , (33, "thirty-three")
+  , (34, "thirty-four")
+  , (35, "thirty-five")
+  , (36, "thirty-six")
+  , (37, "thirty-seven")
+  , (38, "thirty-eight")
+  , (39, "thirty-nine")
+  , (40, "forty")
+  , (41, "forty-one")
+  , (42, "forty-two")
+  , (43, "forty-three")
+  , (44, "forty-four")
+  , (45, "forty-five")
+  , (46, "forty-six")
+  , (47, "forty-seven")
+  , (48, "forty-eight")
+  , (49, "forty-nine")
+  , (50, "fifty")
+  , (51, "fifty-one")
+  , (52, "fifty-two")
+  , (53, "fifty-three")
+  , (54, "fifty-four")
+  , (55, "fifty-five")
+  , (56, "fifty-six")
+  , (57, "fifty-seven")
+  , (58, "fifty-eight")
+  , (59, "fifty-nine")
+  , (60, "sixty")
+  , (61, "sixty-one")
+  , (62, "sixty-two")
+  , (63, "sixty-three")
+  , (64, "sixty-four")
+  , (65, "sixty-five")
+  , (66, "sixty-six")
+  , (67, "sixty-seven")
+  , (68, "sixty-eight")
+  , (69, "sixty-nine")
+  , (70, "seventy")
+  , (71, "seventy-one")
+  , (72, "seventy-two")
+  , (73, "seventy-three")
+  , (74, "seventy-four")
+  , (75, "seventy-five")
+  , (76, "seventy-six")
+  , (77, "seventy-seven")
+  , (78, "seventy-eight")
+  , (79, "seventy-nine")
+  , (80, "eighty")
+  , (81, "eighty-one")
+  , (82, "eighty-two")
+  , (83, "eighty-three")
+  , (84, "eighty-four")
+  , (85, "eighty-five")
+  , (86, "eighty-six")
+  , (87, "eighty-seven")
+  , (88, "eighty-eight")
+  , (89, "eighty-nine")
+  , (90, "ninety")
+  , (91, "ninety-one")
+  , (92, "ninety-two")
+  , (93, "ninety-three")
+  , (94, "ninety-four")
+  , (95, "ninety-five")
+  , (96, "ninety-six")
+  , (97, "ninety-seven")
+  , (98, "ninety-eight")
+  , (99, "ninety-nine")
+  , (100, "one hundred")
+  ]
+
+en_ordinals :: (Num i) => [(i, Text)]
+en_ordinals =
+  [ (0, "zeroth")
+  , (1, "first")
+  , (2, "second")
+  , (3, "third")
+  , (4, "fourth")
+  , (5, "fifth")
+  , (6, "sixth")
+  , (7, "seventh")
+  , (8, "eighth")
+  , (9, "ninth")
+  , (10, "tenth")
+  , (11, "eleventh")
+  , (12, "twelfth")
+  , (13, "thirteenth")
+  , (14, "fourteenth")
+  , (15, "fifteenth")
+  , (16, "sixteenth")
+  , (17, "seventeenth")
+  , (18, "eighteenth")
+  , (19, "nineteenth")
+  , (20, "twentieth")
+  , (21, "twenty-first")
+  , (22, "twenty-second")
+  , (23, "twenty-third")
+  , (24, "twenty-fourth")
+  , (25, "twenty-fifth")
+  , (26, "twenty-sixth")
+  , (27, "twenty-seventh")
+  , (28, "twenty-eighth")
+  , (29, "twenty-ninth")
+  , (30, "thirtieth")
+  , (31, "thirty-first")
+  , (32, "thirty-second")
+  , (33, "thirty-third")
+  , (34, "thirty-fourth")
+  , (35, "thirty-fifth")
+  , (36, "thirty-sixth")
+  , (37, "thirty-seventh")
+  , (38, "thirty-eighth")
+  , (39, "thirty-ninth")
+  , (40, "fortieth")
+  , (41, "forty-first")
+  , (42, "forty-second")
+  , (43, "forty-third")
+  , (44, "forty-fourth")
+  , (45, "forty-fifth")
+  , (46, "forty-sixth")
+  , (47, "forty-seventh")
+  , (48, "forty-eighth")
+  , (49, "forty-ninth")
+  , (50, "fiftieth")
+  , (51, "fifty-first")
+  , (52, "fifty-second")
+  , (53, "fifty-third")
+  , (54, "fifty-fourth")
+  , (55, "fifty-fifth")
+  , (56, "fifty-sixth")
+  , (57, "fifty-seventh")
+  , (58, "fifty-eighth")
+  , (59, "fifty-ninth")
+  , (60, "sixtieth")
+  , (61, "sixty-first")
+  , (62, "sixty-second")
+  , (63, "sixty-third")
+  , (64, "sixty-fourth")
+  , (65, "sixty-fifth")
+  , (66, "sixty-sixth")
+  , (67, "sixty-seventh")
+  , (68, "sixty-eighth")
+  , (69, "sixty-ninth")
+  , (70, "seventieth")
+  , (71, "seventy-first")
+  , (72, "seventy-second")
+  , (73, "seventy-third")
+  , (74, "seventy-fourth")
+  , (75, "seventy-fifth")
+  , (76, "seventy-sixth")
+  , (77, "seventy-seventh")
+  , (78, "seventy-eighth")
+  , (79, "seventy-ninth")
+  , (80, "eightieth")
+  , (81, "eighty-first")
+  , (82, "eighty-second")
+  , (83, "eighty-third")
+  , (84, "eighty-fourth")
+  , (85, "eighty-fifth")
+  , (86, "eighty-sixth")
+  , (87, "eighty-seventh")
+  , (88, "eighty-eighth")
+  , (89, "eighty-ninth")
+  , (90, "ninetieth")
+  , (91, "ninety-first")
+  , (92, "ninety-second")
+  , (93, "ninety-third")
+  , (94, "ninety-fourth")
+  , (95, "ninety-fifth")
+  , (96, "ninety-sixth")
+  , (97, "ninety-seventh")
+  , (98, "ninety-eighth")
+  , (99, "ninety-ninth")
+  , (100, "one hundreth")
+  ]
+
+gb_cardinals :: (Num i) => TestData i
+gb_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , en_cardinals
+      <> [ (-1, "minus one")
+        , (101, "one hundred and one")
+        , (110, "one hundred and ten")
+        , (111, "one hundred and eleven")
+        , (120, "one hundred and twenty")
+        , (121, "one hundred and twenty-one")
+        , (144, "one hundred and forty-four")
+        , (200, "two hundred")
+        , (300, "three hundred")
+        , (666, "six hundred and sixty-six")
+        , (1000, "one thousand")
+        , (1001, "one thousand and one")
+        , (1010, "one thousand and ten")
+        , (1011, "one thousand and eleven")
+        , (1024, "one thousand and twenty-four")
+        , (1100, "one thousand one hundred")
+        , (1728, "one thousand seven hundred and twenty-eight")
+        , (2000, "two thousand")
+        , (10000, "ten thousand")
+        , (100000, "one hundred thousand")
+        , (500000, "five hundred thousand")
+        , (1000000, "one million")
+        , (1048576, "one million forty-eight thousand five hundred and seventy-six")
+        , (10000000, "ten million")
+        ]
+    )
+  ]
+
+gb_ordinals :: (Num i) => TestData i
+gb_ordinals =
+  [ ( "default"
+    , defaultInflection
+    , en_ordinals
+      <> [ (101, "one hundred and first")
+        , (110, "one hundred and tenth")
+        , (111, "one hundred and eleventh")
+        , (120, "one hundred and twentieth")
+        , (121, "one hundred and twenty-first")
+        , (144, "one hundred and forty-fourth")
+        , (200, "two hundreth")
+        , (300, "three hundreth")
+        , (666, "six hundred and sixty-sixth")
+        , (1000, "one thousandth")
+        , (1001, "one thousand and first")
+        , (1010, "one thousand and tenth")
+        , (1011, "one thousand and eleventh")
+        , (1024, "one thousand and twenty-fourth")
+        , (1100, "one thousand one hundreth")
+        , (1728, "one thousand seven hundred and twenty-eighth")
+        , (2000, "two thousandth")
+        , (10000, "ten thousandth")
+        , (100000, "one hundred thousandth")
+        , (500000, "five hundred thousandth")
+        , (1000000, "one millionth")
+        , (1048576, "one million forty-eight thousand five hundred and seventy-sixth")
+        , (10000000, "ten millionth")
+        ]
+    )
+  ]
+
+us_cardinals :: (Num i) => TestData i
+us_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , en_cardinals
+      <> [ (-1, "negative one")
+        , (101, "one hundred one")
+        , (110, "one hundred ten")
+        , (111, "one hundred eleven")
+        , (120, "one hundred twenty")
+        , (121, "one hundred twenty-one")
+        , (144, "one hundred forty-four")
+        , (200, "two hundred")
+        , (300, "three hundred")
+        , (666, "six hundred sixty-six")
+        , (1000, "one thousand")
+        , (1001, "one thousand one")
+        , (1010, "one thousand ten")
+        , (1011, "one thousand eleven")
+        , (1024, "one thousand twenty-four")
+        , (1100, "one thousand one hundred")
+        , (1728, "one thousand seven hundred twenty-eight")
+        , (2000, "two thousand")
+        , (10000, "ten thousand")
+        , (100000, "one hundred thousand")
+        , (500000, "five hundred thousand")
+        , (1000000, "one million")
+        , (1048576, "one million forty-eight thousand five hundred seventy-six")
+        , (10000000, "ten million")
+        ]
+    )
+  ]
+
+us_ordinals :: (Num i) => TestData i
+us_ordinals =
+  [ ( "default"
+    , defaultInflection
+    , en_ordinals
+      <> [ (101, "one hundred first")
+        , (110, "one hundred tenth")
+        , (111, "one hundred eleventh")
+        , (120, "one hundred twentieth")
+        , (121, "one hundred twenty-first")
+        , (144, "one hundred forty-fourth")
+        , (200, "two hundreth")
+        , (300, "three hundreth")
+        , (666, "six hundred sixty-sixth")
+        , (1000, "one thousandth")
+        , (1001, "one thousand first")
+        , (1010, "one thousand tenth")
+        , (1011, "one thousand eleventh")
+        , (1024, "one thousand twenty-fourth")
+        , (1100, "one thousand one hundreth")
+        , (1728, "one thousand seven hundred twenty-eighth")
+        , (2000, "two thousandth")
+        , (10000, "ten thousandth")
+        , (100000, "one hundred thousandth")
+        , (500000, "five hundred thousandth")
+        , (1000000, "one millionth")
+        , (1048576, "one million forty-eight thousand five hundred seventy-sixth")
+        , (10000000, "ten millionth")
+        ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/EO/TestData.hs b/src-test/Text/Numeral/Language/EO/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/EO/TestData.hs
+++ /dev/null
@@ -1,142 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        eo
-
-[@ISO639-2B@]       epo
-
-[@ISO639-3@]        epo
-
-[@Native name@]     Esperanto
-
-[@English name@]    Esperanto
--}
-
-module Text.Numeral.Language.EO.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "nul")
-      , (1, "unu")
-      , (2, "du")
-      , (3, "tri")
-      , (4, "kvar")
-      , (5, "kvin")
-      , (6, "ses")
-      , (7, "sep")
-      , (8, "ok")
-      , (9, "naŭ")
-      , (10, "dek")
-      , (11, "dek unu")
-      , (12, "dek du")
-      , (13, "dek tri")
-      , (14, "dek kvar")
-      , (15, "dek kvin")
-      , (16, "dek ses")
-      , (17, "dek sep")
-      , (18, "dek ok")
-      , (19, "dek naŭ")
-      , (20, "dudek")
-      , (21, "dudek unu")
-      , (22, "dudek du")
-      , (23, "dudek tri")
-      , (24, "dudek kvar")
-      , (25, "dudek kvin")
-      , (26, "dudek ses")
-      , (27, "dudek sep")
-      , (28, "dudek ok")
-      , (29, "dudek naŭ")
-      , (30, "tridek")
-      , (31, "tridek unu")
-      , (32, "tridek du")
-      , (33, "tridek tri")
-      , (34, "tridek kvar")
-      , (35, "tridek kvin")
-      , (36, "tridek ses")
-      , (37, "tridek sep")
-      , (38, "tridek ok")
-      , (39, "tridek naŭ")
-      , (40, "kvardek")
-      , (41, "kvardek unu")
-      , (42, "kvardek du")
-      , (43, "kvardek tri")
-      , (44, "kvardek kvar")
-      , (45, "kvardek kvin")
-      , (46, "kvardek ses")
-      , (47, "kvardek sep")
-      , (48, "kvardek ok")
-      , (49, "kvardek naŭ")
-      , (50, "kvindek")
-      , (51, "kvindek unu")
-      , (52, "kvindek du")
-      , (53, "kvindek tri")
-      , (54, "kvindek kvar")
-      , (55, "kvindek kvin")
-      , (56, "kvindek ses")
-      , (57, "kvindek sep")
-      , (58, "kvindek ok")
-      , (59, "kvindek naŭ")
-      , (60, "sesdek")
-      , (61, "sesdek unu")
-      , (62, "sesdek du")
-      , (63, "sesdek tri")
-      , (64, "sesdek kvar")
-      , (65, "sesdek kvin")
-      , (66, "sesdek ses")
-      , (67, "sesdek sep")
-      , (68, "sesdek ok")
-      , (69, "sesdek naŭ")
-      , (70, "sepdek")
-      , (71, "sepdek unu")
-      , (72, "sepdek du")
-      , (73, "sepdek tri")
-      , (74, "sepdek kvar")
-      , (75, "sepdek kvin")
-      , (76, "sepdek ses")
-      , (77, "sepdek sep")
-      , (78, "sepdek ok")
-      , (79, "sepdek naŭ")
-      , (80, "okdek")
-      , (81, "okdek unu")
-      , (82, "okdek du")
-      , (83, "okdek tri")
-      , (84, "okdek kvar")
-      , (85, "okdek kvin")
-      , (86, "okdek ses")
-      , (87, "okdek sep")
-      , (88, "okdek ok")
-      , (89, "okdek naŭ")
-      , (90, "naŭdek")
-      , (91, "naŭdek unu")
-      , (92, "naŭdek du")
-      , (93, "naŭdek tri")
-      , (94, "naŭdek kvar")
-      , (95, "naŭdek kvin")
-      , (96, "naŭdek ses")
-      , (97, "naŭdek sep")
-      , (98, "naŭdek ok")
-      , (99, "naŭdek naŭ")
-      , (100, "cent")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/EPO/TestData.hs b/src-test/Text/Numeral/Language/EPO/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/EPO/TestData.hs
@@ -0,0 +1,135 @@
+{-|
+[@ISO639-1@]        eo
+
+[@ISO639-2B@]       epo
+
+[@ISO639-3@]        epo
+
+[@Native name@]     Esperanto
+
+[@English name@]    Esperanto
+-}
+
+module Text.Numeral.Language.EPO.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "nul")
+      , (1, "unu")
+      , (2, "du")
+      , (3, "tri")
+      , (4, "kvar")
+      , (5, "kvin")
+      , (6, "ses")
+      , (7, "sep")
+      , (8, "ok")
+      , (9, "naŭ")
+      , (10, "dek")
+      , (11, "dek unu")
+      , (12, "dek du")
+      , (13, "dek tri")
+      , (14, "dek kvar")
+      , (15, "dek kvin")
+      , (16, "dek ses")
+      , (17, "dek sep")
+      , (18, "dek ok")
+      , (19, "dek naŭ")
+      , (20, "dudek")
+      , (21, "dudek unu")
+      , (22, "dudek du")
+      , (23, "dudek tri")
+      , (24, "dudek kvar")
+      , (25, "dudek kvin")
+      , (26, "dudek ses")
+      , (27, "dudek sep")
+      , (28, "dudek ok")
+      , (29, "dudek naŭ")
+      , (30, "tridek")
+      , (31, "tridek unu")
+      , (32, "tridek du")
+      , (33, "tridek tri")
+      , (34, "tridek kvar")
+      , (35, "tridek kvin")
+      , (36, "tridek ses")
+      , (37, "tridek sep")
+      , (38, "tridek ok")
+      , (39, "tridek naŭ")
+      , (40, "kvardek")
+      , (41, "kvardek unu")
+      , (42, "kvardek du")
+      , (43, "kvardek tri")
+      , (44, "kvardek kvar")
+      , (45, "kvardek kvin")
+      , (46, "kvardek ses")
+      , (47, "kvardek sep")
+      , (48, "kvardek ok")
+      , (49, "kvardek naŭ")
+      , (50, "kvindek")
+      , (51, "kvindek unu")
+      , (52, "kvindek du")
+      , (53, "kvindek tri")
+      , (54, "kvindek kvar")
+      , (55, "kvindek kvin")
+      , (56, "kvindek ses")
+      , (57, "kvindek sep")
+      , (58, "kvindek ok")
+      , (59, "kvindek naŭ")
+      , (60, "sesdek")
+      , (61, "sesdek unu")
+      , (62, "sesdek du")
+      , (63, "sesdek tri")
+      , (64, "sesdek kvar")
+      , (65, "sesdek kvin")
+      , (66, "sesdek ses")
+      , (67, "sesdek sep")
+      , (68, "sesdek ok")
+      , (69, "sesdek naŭ")
+      , (70, "sepdek")
+      , (71, "sepdek unu")
+      , (72, "sepdek du")
+      , (73, "sepdek tri")
+      , (74, "sepdek kvar")
+      , (75, "sepdek kvin")
+      , (76, "sepdek ses")
+      , (77, "sepdek sep")
+      , (78, "sepdek ok")
+      , (79, "sepdek naŭ")
+      , (80, "okdek")
+      , (81, "okdek unu")
+      , (82, "okdek du")
+      , (83, "okdek tri")
+      , (84, "okdek kvar")
+      , (85, "okdek kvin")
+      , (86, "okdek ses")
+      , (87, "okdek sep")
+      , (88, "okdek ok")
+      , (89, "okdek naŭ")
+      , (90, "naŭdek")
+      , (91, "naŭdek unu")
+      , (92, "naŭdek du")
+      , (93, "naŭdek tri")
+      , (94, "naŭdek kvar")
+      , (95, "naŭdek kvin")
+      , (96, "naŭdek ses")
+      , (97, "naŭdek sep")
+      , (98, "naŭdek ok")
+      , (99, "naŭdek naŭ")
+      , (100, "cent")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/ES/TestData.hs b/src-test/Text/Numeral/Language/ES/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/ES/TestData.hs
+++ /dev/null
@@ -1,280 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        es
-
-[@ISO639-2B@]       spa
-
-[@ISO639-3@]        spa
-
-[@Native name@]     Español
-
-[@English name@]    Spanish
--}
-
-module Text.Numeral.Language.ES.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Num, (+), Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Misc ( dec )
-import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
--- Sources:
---   http://www.sf.airnet.ne.jp/~ts/language/number/spanish.html
---   http://spanish.about.com/cs/forbeginners/a/cardinalnum_beg.htm
---   http://www.learn-spanish-help.com/count-in-spanish.html
---   http://www.donquijote.org/spanishlanguage/numbers/numbers1.asp
---   http://en.wiktionary.org/wiki/Appendix:Spanish_numerals
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "neuter"
-    , neuter defaultInflection
-    , [ (-3, "menos tres")
-      , (-2, "menos dos")
-      , (-1, "menos uno")
-      , (0, "cero")
-      , (1, "uno")
-      , (2, "dos")
-      , (3, "tres")
-      , (4, "cuatro")
-      , (5, "cinco")
-      , (6, "seis")
-      , (7, "siete")
-      , (8, "ocho")
-      , (9, "nueve")
-      , (10, "diez")
-      , (11, "once")
-      , (12, "doce")
-      , (13, "trece")
-      , (14, "catorce")
-      , (15, "quince")
-      , (16, "dieciséis")
-      , (17, "diecisiete")
-      , (18, "dieciocho")
-      , (19, "diecinueve")
-      , (20, "veinte")
-      , (21, "veintiuno")
-      , (22, "veintidós")
-      , (23, "veintitrés")
-      , (24, "veinticuatro")
-      , (25, "veinticinco")
-      , (26, "veintiséis")
-      , (27, "veintisiete")
-      , (28, "veintiocho")
-      , (29, "veintinueve")
-      , (30, "treinta")
-      , (31, "treinta y uno")
-      , (32, "treinta y dos")
-      , (33, "treinta y tres")
-      , (34, "treinta y cuatro")
-      , (35, "treinta y cinco")
-      , (36, "treinta y seis")
-      , (37, "treinta y siete")
-      , (38, "treinta y ocho")
-      , (39, "treinta y nueve")
-      , (40, "cuarenta")
-      , (41, "cuarenta y uno")
-      , (42, "cuarenta y dos")
-      , (43, "cuarenta y tres")
-      , (44, "cuarenta y cuatro")
-      , (45, "cuarenta y cinco")
-      , (46, "cuarenta y seis")
-      , (47, "cuarenta y siete")
-      , (48, "cuarenta y ocho")
-      , (49, "cuarenta y nueve")
-      , (50, "cincuenta")
-      , (51, "cincuenta y uno")
-      , (52, "cincuenta y dos")
-      , (53, "cincuenta y tres")
-      , (54, "cincuenta y cuatro")
-      , (55, "cincuenta y cinco")
-      , (56, "cincuenta y seis")
-      , (57, "cincuenta y siete")
-      , (58, "cincuenta y ocho")
-      , (59, "cincuenta y nueve")
-      , (60, "sesenta")
-      , (61, "sesenta y uno")
-      , (62, "sesenta y dos")
-      , (63, "sesenta y tres")
-      , (64, "sesenta y cuatro")
-      , (65, "sesenta y cinco")
-      , (66, "sesenta y seis")
-      , (67, "sesenta y siete")
-      , (68, "sesenta y ocho")
-      , (69, "sesenta y nueve")
-      , (70, "setenta")
-      , (71, "setenta y uno")
-      , (72, "setenta y dos")
-      , (73, "setenta y tres")
-      , (74, "setenta y cuatro")
-      , (75, "setenta y cinco")
-      , (76, "setenta y seis")
-      , (77, "setenta y siete")
-      , (78, "setenta y ocho")
-      , (79, "setenta y nueve")
-      , (80, "ochenta")
-      , (81, "ochenta y uno")
-      , (82, "ochenta y dos")
-      , (83, "ochenta y tres")
-      , (84, "ochenta y cuatro")
-      , (85, "ochenta y cinco")
-      , (86, "ochenta y seis")
-      , (87, "ochenta y siete")
-      , (88, "ochenta y ocho")
-      , (89, "ochenta y nueve")
-      , (90, "noventa")
-      , (91, "noventa y uno")
-      , (92, "noventa y dos")
-      , (93, "noventa y tres")
-      , (94, "noventa y cuatro")
-      , (95, "noventa y cinco")
-      , (96, "noventa y seis")
-      , (97, "noventa y siete")
-      , (98, "noventa y ocho")
-      , (99, "noventa y nueve")
-      , (100, "cien")
-      , (101, "ciento uno")
-      , (103, "ciento tres")
-      , (114, "ciento catorce")
-      , (127, "ciento veintisiete")
-      , (165, "ciento sesenta y cinco")
-      , (198, "ciento noventa y ocho")
-      , (199, "ciento noventa y nueve")
-      , (200, "doscientos")
-      , (221, "doscientos veintiuno")
-      , (256, "doscientos cincuenta y seis")
-      , (300, "trescientos")
-      , (400, "cuatrocientos")
-      , (496, "cuatrocientos noventa y seis")
-      , (500, "quinientos")
-      , (512, "quinientos doce")
-      , (600, "seiscientos")
-      , (666, "seiscientos sesenta y seis")
-      , (700, "setecientos")
-      , (800, "ochocientos")
-      , (900, "novecientos")
-      , (1000, "mil")
-      , (1002, "mil dos")
-      , (1024, "mil veinticuatro")
-      , (1729, "mil setecientos veintinueve")
-      , (2000, "dos mil")
-      , (2800, "dos mil ochocientos")
-      , (3000, "tres mil")
-      , (4000, "cuatro mil")
-      , (5000, "cinco mil")
-      , (6000, "seis mil")
-      , (7000, "siete mil")
-      , (8000, "ocho mil")
-      , (9000, "nueve mil")
-      , (dec 4, "diez mil")
-      , (15000, "quince mil")
-      , (18000, "dieciocho mil")
-      , (22000, "veintidós mil")
-      , (28000, "veintiocho mil")
-      , (37000, "treinta y siete mil")
-      , (85000, "ochenta y cinco mil")
-      , (dec 5, "cien mil")
-      , (108000, "ciento ocho mil")
-      , (160000, "ciento sesenta mil")
-      , (585000, "quinientos ochenta y cinco mil")
-      , (999000, "novecientos noventa y nueve mil")
-      , (dec 6, "un millón")
-      , (dec 6 + 1, "un millón uno")
-      , (21 ⋅ dec 6 + 21, "veintiún millones veintiuno")
-      , (500 ⋅ dec 6, "quinientos millones")
-      , (521 ⋅ dec 6 + 1, "quinientos veintiún millones uno")
-      , (dec 7, "diez millones")
-      , (dec 8, "cien millones")
-      , (dec 9, "mil millones")
-      , (dec 10, "diez mil millones")
-      , (dec 11, "cien mil millones")
-      , (dec 12, "un billón")
-      , (dec 18, "un trillón")
-      , (dec 24, "un cuatrillón")
-      , (15936535897932384626433832795, "quince mil novecientos treinta y seis cuatrillones quinientos treinta y cinco mil ochocientos noventa y siete trillones novecientos treinta y dos mil trescientos ochenta y cuatro billones seiscientos veintiséis mil cuatrocientos treinta y tres millones ochocientos treinta y dos mil setecientos noventa y cinco")
-      , (dec 30, "un quintillón")
-      , (31415926535897932384626433832795, "treinta y un quintillones cuatrocientos quince mil novecientos veintiséis cuatrillones quinientos treinta y cinco mil ochocientos noventa y siete trillones novecientos treinta y dos mil trescientos ochenta y cuatro billones seiscientos veintiséis mil cuatrocientos treinta y tres millones ochocientos treinta y dos mil setecientos noventa y cinco")
-      , (dec 36, "un sextillón")
-      , (dec 42, "un septillón")
-      , (dec 48, "un octillón")
-      , (dec 54, "un nonillón")
-      , (dec 60, "un decillón")
-      , (dec 66, "un undecillón")
-      , (dec 72, "un duodecillón")
-      , (dec 78, "un tredecillón")
-      , (dec 84, "un cuatordecillón")
-      , (dec 90, "un quindecillón")
-      , (dec 96, "un sexdecillón")
-      , (dec 102, "un septendecillón")
-      , (dec 108, "un octodecillón")
-      , (dec 114, "un novendecillón")
-      , (dec 120, "un vigintillón")
-      ]
-    )
-  , ( "feminine"
-    , feminine defaultInflection
-    , [ (1, "una")
-      , (11, "once")
-      , (21, "veintiuna")
-      , (31, "treinta y una")
-      , (41, "cuarenta y una")
-      , (51, "cincuenta y una")
-      , (61, "sesenta y una")
-      , (71, "setenta y una")
-      , (81, "ochenta y una")
-      , (91, "noventa y una")
-      , (100, "cien")
-      , (101, "ciento una")
-      , (200, "doscientas")
-      , (221, "doscientas veintiuna")
-      , (300, "trescientas")
-      , (400, "cuatrocientas")
-      , (500, "quinientas")
-      , (600, "seiscientas")
-      , (700, "setecientas")
-      , (800, "ochocientas")
-      , (900, "novecientas")
-      , (dec 6, "un millón")
-      , (dec 6 + 1, "un millón una")
-      , (21 ⋅ dec 6 + 21, "veintiún millones veintiuna")
-      ]
-    )
-  , ( "masculine"
-    , masculine defaultInflection
-    , [ (1, "un")
-      , (11, "once")
-      , (21, "veintiún")
-      , (31, "treinta y un")
-      , (41, "cuarenta y un")
-      , (51, "cincuenta y un")
-      , (61, "sesenta y un")
-      , (71, "setenta y un")
-      , (81, "ochenta y un")
-      , (91, "noventa y un")
-      , (100, "cien")
-      , (101, "ciento un")
-      , (200, "doscientos")
-      , (221, "doscientos veintiún")
-      , (dec 6, "un millón")
-      , (dec 6 + 1, "un millón un")
-      , (21 ⋅ dec 6 + 21, "veintiún millones veintiún")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/ET/TestData.hs b/src-test/Text/Numeral/Language/ET/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/ET/TestData.hs
+++ /dev/null
@@ -1,220 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        et
-
-[@ISO639-2@]        est
-
-[@ISO639-3@]        est
-
-[@Native name@]     eesti keel
-
-[@English name@]    Estonian
--}
-
-module Text.Numeral.Language.ET.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "null")
-      , (1, "üks")
-      , (2, "kaks")
-      , (3, "kolm")
-      , (4, "neli")
-      , (5, "viis")
-      , (6, "kuus")
-      , (7, "seitse")
-      , (8, "kaheksa")
-      , (9, "üheksa")
-      , (10, "kümme")
-      , (11, "üksteist")
-      , (12, "kaksteist")
-      , (13, "kolmteist")
-      , (14, "neliteist")
-      , (15, "viisteist")
-      , (16, "kuusteist")
-      , (17, "seitseteist")
-      , (18, "kaheksateist")
-      , (19, "üheksateist")
-      , (20, "kakskümmend")
-      , (21, "kakskümmend üks")
-      , (22, "kakskümmend kaks")
-      , (23, "kakskümmend kolm")
-      , (24, "kakskümmend neli")
-      , (25, "kakskümmend viis")
-      , (26, "kakskümmend kuus")
-      , (27, "kakskümmend seitse")
-      , (28, "kakskümmend kaheksa")
-      , (29, "kakskümmend üheksa")
-      , (30, "kolmkümmend")
-      , (31, "kolmkümmend üks")
-      , (32, "kolmkümmend kaks")
-      , (33, "kolmkümmend kolm")
-      , (34, "kolmkümmend neli")
-      , (35, "kolmkümmend viis")
-      , (36, "kolmkümmend kuus")
-      , (37, "kolmkümmend seitse")
-      , (38, "kolmkümmend kaheksa")
-      , (39, "kolmkümmend üheksa")
-      , (40, "nelikümmend")
-      , (41, "nelikümmend üks")
-      , (42, "nelikümmend kaks")
-      , (43, "nelikümmend kolm")
-      , (44, "nelikümmend neli")
-      , (45, "nelikümmend viis")
-      , (46, "nelikümmend kuus")
-      , (47, "nelikümmend seitse")
-      , (48, "nelikümmend kaheksa")
-      , (49, "nelikümmend üheksa")
-      , (50, "viiskümmend")
-      , (51, "viiskümmend üks")
-      , (52, "viiskümmend kaks")
-      , (53, "viiskümmend kolm")
-      , (54, "viiskümmend neli")
-      , (55, "viiskümmend viis")
-      , (56, "viiskümmend kuus")
-      , (57, "viiskümmend seitse")
-      , (58, "viiskümmend kaheksa")
-      , (59, "viiskümmend üheksa")
-      , (61, "kuuskümmend üks")
-      , (62, "kuuskümmend kaks")
-      , (63, "kuuskümmend kolm")
-      , (64, "kuuskümmend neli")
-      , (65, "kuuskümmend viis")
-      , (66, "kuuskümmend kuus")
-      , (67, "kuuskümmend seitse")
-      , (68, "kuuskümmend kaheksa")
-      , (69, "kuuskümmend üheksa")
-      , (71, "seitsekümmend üks")
-      , (72, "seitsekümmend kaks")
-      , (73, "seitsekümmend kolm")
-      , (74, "seitsekümmend neli")
-      , (75, "seitsekümmend viis")
-      , (76, "seitsekümmend kuus")
-      , (77, "seitsekümmend seitse")
-      , (78, "seitsekümmend kaheksa")
-      , (79, "seitsekümmend üheksa")
-      , (81, "kaheksakümmend üks")
-      , (82, "kaheksakümmend kaks")
-      , (83, "kaheksakümmend kolm")
-      , (84, "kaheksakümmend neli")
-      , (85, "kaheksakümmend viis")
-      , (86, "kaheksakümmend kuus")
-      , (87, "kaheksakümmend seitse")
-      , (88, "kaheksakümmend kaheksa")
-      , (89, "kaheksakümmend üheksa")
-      , (91, "üheksakümmend üks")
-      , (92, "üheksakümmend kaks")
-      , (93, "üheksakümmend kolm")
-      , (94, "üheksakümmend neli")
-      , (95, "üheksakümmend viis")
-      , (96, "üheksakümmend kuus")
-      , (97, "üheksakümmend seitse")
-      , (98, "üheksakümmend kaheksa")
-      , (99, "üheksakümmend üheksa")
-      , (100, "sada")
-      , (101, "sadaüks")
-      , (102, "sadakaks")
-      , (103, "sadakolm")
-      , (104, "sadaneli")
-      , (105, "sadaviis")
-      , (106, "sadakuus")
-      , (107, "sadaseitse")
-      , (108, "sadakaheksa")
-      , (109, "sadaüheksa")
-      , (110, "sadakümme")
-      , (123, "sadakakskümmend kolm")
-      , (200, "kakssada")
-      , (300, "kolmsada")
-      , (321, "kolmsadakakskümmend üks")
-      , (400, "nelisada")
-      , (500, "viissada")
-      , (600, "kuussada")
-      , (700, "seitsesada")
-      , (800, "kaheksasada")
-      , (900, "üheksasada")
-      , (909, "üheksasadaüheksa")
-      , (990, "üheksasadaüheksakümmend")
-      , (999, "üheksasadaüheksakümmend üheksa")
-      , (1000, "tuhat")
-      , (1001, "tuhatüks")
-      , (1008, "tuhatkaheksa")
-      , (1234, "tuhatkakssadakolmkümmend neli")
-      , (2000, "kaks tuhat")
-      , (3000, "kolm tuhat")
-      , (4000, "neli tuhat")
-      , (4321, "neli tuhatkolmsadakakskümmend üks")
-      , (5000, "viis tuhat")
-      , (6000, "kuus tuhat")
-      , (7000, "seitse tuhat")
-      , (8000, "kaheksa tuhat")
-      , (9000, "üheksa tuhat")
-      , (10000, "kümme tuhat")
-      , (12345, "kaksteist tuhatkolmsadanelikümmend viis")
-      , (20000, "kakskümmend tuhat")
-      , (30000, "kolmkümmend tuhat")
-      , (40000, "nelikümmend tuhat")
-      , (50000, "viiskümmend tuhat")
-      , (54321, "viiskümmend neli tuhatkolmsadakakskümmend üks")
-      , (60000, "kuuskümmend tuhat")
-      , (70000, "seitsekümmend tuhat")
-      , (80000, "kaheksakümmend tuhat")
-      , (90000, "üheksakümmend tuhat")
-      , (100000, "sada tuhat")
-      , (123456, "sadakakskümmend kolm tuhatnelisadaviiskümmend kuus")
-      , (200000, "kakssada tuhat")
-      , (300000, "kolmsada tuhat")
-      , (400000, "nelisada tuhat")
-      , (500000, "viissada tuhat")
-      , (600000, "kuussada tuhat")
-      , (654321, "kuussadaviiskümmend neli tuhatkolmsadakakskümmend üks")
-      , (700000, "seitsesada tuhat")
-      , (800000, "kaheksasada tuhat")
-      , (900000, "üheksasada tuhat")
-      , (1000000, "miljon")
-      , (1000001, "miljonüks")
-      , (1234567, "miljonkakssadakolmkümmend neli tuhatviissadakuuskümmend seitse")
-      , (2000000, "kaks miljonit")
-      , (3000000, "kolm miljonit")
-      , (4000000, "neli miljonit")
-      , (5000000, "viis miljonit")
-      , (6000000, "kuus miljonit")
-      , (7000000, "seitse miljonit")
-      , (7654321, "seitse miljonitkuussadaviiskümmend neli tuhatkolmsadakakskümmend üks")
-      , (8000000, "kaheksa miljonit")
-      , (9000000, "üheksa miljonit")
-      , (1000000000, "miljard")
-      , (1000000001, "miljardüks")
-      , (2000000000, "kaks miljard")
-      , (3000000000, "kolm miljard")
-      , (4000000000, "neli miljard")
-      , (5000000000, "viis miljard")
-      , (6000000000, "kuus miljard")
-      , (7000000000, "seitse miljard")
-      , (8000000000, "kaheksa miljard")
-      , (9000000000, "üheksa miljard")
-      , (1000000000000, "triljon")
-      , (1000000000001, "triljonüks")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/FAO/TestData.hs b/src-test/Text/Numeral/Language/FAO/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/FAO/TestData.hs
@@ -0,0 +1,219 @@
+{-|
+[@ISO639-1@]        fo
+
+[@ISO639-2@]        fao
+
+[@ISO639-3@]        fao
+
+[@Native name@]     føroyskt
+
+[@English name@]    Faroese
+-}
+module Text.Numeral.Language.FAO.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-faroese/en/fao/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "null")
+      , (1, "ein")
+      , (2, "tveir")
+      , (3, "tríggir")
+      , (4, "fýra")
+      , (5, "fimm")
+      , (6, "seks")
+      , (7, "sjey")
+      , (8, "átta")
+      , (9, "níggju")
+      , (10, "tíggju")
+      , (11, "ellivu")
+      , (12, "tólv")
+      , (13, "trettan")
+      , (14, "fjúrtan")
+      , (15, "fimtan")
+      , (16, "sekstan")
+      , (17, "seytjan")
+      , (18, "átjan")
+      , (19, "nítjan")
+      , (20, "tjúgu")
+      , (21, "ein og tjúgu")
+      , (22, "tveir og tjúgu")
+      , (23, "tríggir og tjúgu")
+      , (24, "fýra og tjúgu")
+      , (25, "fimm og tjúgu")
+      , (26, "seks og tjúgu")
+      , (27, "sjey og tjúgu")
+      , (28, "átta og tjúgu")
+      , (29, "níggju og tjúgu")
+      , (30, "tríati")
+      , (31, "ein og tríati")
+      , (32, "tveir og tríati")
+      , (33, "tríggir og tríati")
+      , (34, "fýra og tríati")
+      , (35, "fimm og tríati")
+      , (36, "seks og tríati")
+      , (37, "sjey og tríati")
+      , (38, "átta og tríati")
+      , (39, "níggju og tríati")
+      , (40, "fýrati")
+      , (41, "ein og fýrati")
+      , (42, "tveir og fýrati")
+      , (43, "tríggir og fýrati")
+      , (44, "fýra og fýrati")
+      , (45, "fimm og fýrati")
+      , (46, "seks og fýrati")
+      , (47, "sjey og fýrati")
+      , (48, "átta og fýrati")
+      , (49, "níggju og fýrati")
+      , (50, "fimmti")
+      , (51, "ein og fimmti")
+      , (52, "tveir og fimmti")
+      , (53, "tríggir og fimmti")
+      , (54, "fýra og fimmti")
+      , (55, "fimm og fimmti")
+      , (56, "seks og fimmti")
+      , (57, "sjey og fimmti")
+      , (58, "átta og fimmti")
+      , (59, "níggju og fimmti")
+      , (60, "seksti")
+      , (61, "ein og seksti")
+      , (62, "tveir og seksti")
+      , (63, "tríggir og seksti")
+      , (64, "fýra og seksti")
+      , (65, "fimm og seksti")
+      , (66, "seks og seksti")
+      , (67, "sjey og seksti")
+      , (68, "átta og seksti")
+      , (69, "níggju og seksti")
+      , (70, "sjeyti")
+      , (71, "ein og sjeyti")
+      , (72, "tveir og sjeyti")
+      , (73, "tríggir og sjeyti")
+      , (74, "fýra og sjeyti")
+      , (75, "fimm og sjeyti")
+      , (76, "seks og sjeyti")
+      , (77, "sjey og sjeyti")
+      , (78, "átta og sjeyti")
+      , (79, "níggju og sjeyti")
+      , (80, "áttati")
+      , (81, "ein og áttati")
+      , (82, "tveir og áttati")
+      , (83, "tríggir og áttati")
+      , (84, "fýra og áttati")
+      , (85, "fimm og áttati")
+      , (86, "seks og áttati")
+      , (87, "sjey og áttati")
+      , (88, "átta og áttati")
+      , (89, "níggju og áttati")
+      , (90, "níti")
+      , (91, "ein og níti")
+      , (92, "tveir og níti")
+      , (93, "tríggir og níti")
+      , (94, "fýra og níti")
+      , (95, "fimm og níti")
+      , (96, "seks og níti")
+      , (97, "sjey og níti")
+      , (98, "átta og níti")
+      , (99, "níggju og níti")
+      , (100, "hundrað")
+      , (101, "hundrað og ein")
+      , (102, "hundrað og tveir")
+      , (103, "hundrað og tríggir")
+      , (104, "hundrað og fýra")
+      , (105, "hundrað og fimm")
+      , (106, "hundrað og seks")
+      , (107, "hundrað og sjey")
+      , (108, "hundrað og átta")
+      , (109, "hundrað og níggju")
+      , (110, "hundrað og tíggju")
+      , (123, "hundrað og tríggir og tjúgu")
+      , (200, "tvey hundrað")
+      , (300, "trý hundrað")
+      , (321, "trý hundrað og ein og tjúgu")
+      , (400, "fýra hundrað")
+      , (500, "fimm hundrað")
+      , (600, "seks hundrað")
+      , (700, "sjey hundrað")
+      , (800, "átta hundrað")
+      , (900, "níggju hundrað")
+      , (909, "níggju hundrað og níggju")
+      , (990, "níggju hundrað og níti")
+      , (999, "níggju hundrað og níggju og níti")
+      , (1000, "túsund")
+      , (1001, "eitt túsund og ein")
+      , (1008, "eitt túsund og átta")
+      , (1234, "eitt túsund tvey hundrað og fýra og tríati")
+      , (2000, "tvey túsund")
+      , (3000, "trý túsund")
+      , (4000, "fýra túsund")
+      , (4321, "fýra túsund trý hundrað og ein og tjúgu")
+      , (5000, "fimm túsund")
+      , (6000, "seks túsund")
+      , (7000, "sjey túsund")
+      , (8000, "átta túsund")
+      , (9000, "níggju túsund")
+      , (10000, "tíggju túsund")
+      , (12345, "tólv túsund trý hundrað og fimm og fýrati")
+      , (20000, "tjúgu túsund")
+      , (30000, "tríati túsund")
+      , (40000, "fýrati túsund")
+      , (50000, "fimmti túsund")
+      , (54321, "fýra og fimmti túsund trý hundrað og ein og tjúgu")
+      , (60000, "seksti túsund")
+      , (70000, "sjeyti túsund")
+      , (80000, "áttati túsund")
+      , (90000, "níti túsund")
+      , (100000, "hundrað túsund")
+      , (123456, "hundrað og tríggir og tjúgu túsund og fýra hundrað og seks og fimmti")
+      , (200000, "tvey hundrað túsund")
+      , (300000, "trý hundrað túsund")
+      , (400000, "fýra hundrað túsund")
+      , (500000, "fimm hundrað túsund")
+      , (600000, "seks hundrað túsund")
+      , (654321, "seks hundrað og fýra og fimmti túsund trý hundrað og ein og tjúgu")
+      , (700000, "sjey hundrað túsund")
+      , (800000, "átta hundrað túsund")
+      , (900000, "níggju hundrað túsund")
+      , (1000000, "ein millión")
+      , (1000001, "ein millión og ein")
+      , (1234567, "ein millión tvey hundrað og fýra og tríati túsund og fimm hundrað og sjey og seksti")
+      , (2000000, "tvær milliónir")
+      , (3000000, "tríggjar milliónir")
+      , (4000000, "fýra milliónir")
+      , (5000000, "fimm milliónir")
+      , (6000000, "seks milliónir")
+      , (7000000, "sjey milliónir")
+      , (7654321, "sjey milliónir og seks hundrað og fýra og fimmti túsund trý hundrað og ein og tjúgu")
+      , (8000000, "átta milliónir")
+      , (9000000, "níggju milliónir")
+      , (1000000000, "ein milliard")
+      , (1000000001, "ein milliard og ein")
+      , (2000000000, "tveir milliardir")
+      , (3000000000, "tríggir milliardir")
+      , (4000000000, "fýra milliardir")
+      , (5000000000, "fimm milliardir")
+      , (6000000000, "seks milliardir")
+      , (7000000000, "sjey milliardir")
+      , (8000000000, "átta milliardir")
+      , (9000000000, "níggju milliardir")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/FI/TestData.hs b/src-test/Text/Numeral/Language/FI/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/FI/TestData.hs
+++ /dev/null
@@ -1,1827 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        fi
-
-[@ISO639-2@]        fin
-
-[@ISO639-3@]        fin
-
-[@Native name@]     suomi
-
-[@English name@]    Finnish
--}
-
-module Text.Numeral.Language.FI.TestData
-    ( cardinals
-    , ordinals
-    , multiplicatives
-    , multipliers
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($) )
-import "base" Prelude     ( Integral, (+) )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
--- Sources:
---   http://www.marijn.org/everything-is-4/counting-0-to-100/finnish
---   http://www.languagesandnumbers.com/how-to-count-in-finnish/en/fin/
---   http://en.wikipedia.org/wiki/Finnish_numerals
---   http://mylanguages.org/finnish_numbers.php
---   http://users.jyu.fi/~pamakine/kieli/suomi/numeraalit/numeroten.html
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "singular nominative"
-    , singular $ nominative defaultInflection
-    , [ (0, "nolla")
-      , (1, "yksi")
-      , (2, "kaksi")
-      , (3, "kolme")
-      , (4, "neljä")
-      , (5, "viisi")
-      , (6, "kuusi")
-      , (7, "seitsemän")
-      , (8, "kahdeksan")
-      , (9, "yhdeksän")
-      , (10, "kymmenen")
-      , (11, "yksitoista")
-      , (12, "kaksitoista")
-      , (13, "kolmetoista")
-      , (14, "neljätoista")
-      , (15, "viisitoista")
-      , (16, "kuusitoista")
-      , (17, "seitsemäntoista")
-      , (18, "kahdeksantoista")
-      , (19, "yhdeksäntoista")
-      , (20, "kaksikymmentä")
-      , (21, "kaksikymmentäyksi")
-      , (22, "kaksikymmentäkaksi")
-      , (23, "kaksikymmentäkolme")
-      , (24, "kaksikymmentäneljä")
-      , (25, "kaksikymmentäviisi")
-      , (26, "kaksikymmentäkuusi")
-      , (27, "kaksikymmentäseitsemän")
-      , (28, "kaksikymmentäkahdeksan")
-      , (29, "kaksikymmentäyhdeksän")
-      , (30, "kolmekymmentä")
-      , (31, "kolmekymmentäyksi")
-      , (32, "kolmekymmentäkaksi")
-      , (33, "kolmekymmentäkolme")
-      , (34, "kolmekymmentäneljä")
-      , (35, "kolmekymmentäviisi")
-      , (36, "kolmekymmentäkuusi")
-      , (37, "kolmekymmentäseitsemän")
-      , (38, "kolmekymmentäkahdeksan")
-      , (39, "kolmekymmentäyhdeksän")
-      , (40, "neljäkymmentä")
-      , (41, "neljäkymmentäyksi")
-      , (42, "neljäkymmentäkaksi")
-      , (43, "neljäkymmentäkolme")
-      , (44, "neljäkymmentäneljä")
-      , (45, "neljäkymmentäviisi")
-      , (46, "neljäkymmentäkuusi")
-      , (47, "neljäkymmentäseitsemän")
-      , (48, "neljäkymmentäkahdeksan")
-      , (49, "neljäkymmentäyhdeksän")
-      , (50, "viisikymmentä")
-      , (51, "viisikymmentäyksi")
-      , (52, "viisikymmentäkaksi")
-      , (53, "viisikymmentäkolme")
-      , (54, "viisikymmentäneljä")
-      , (55, "viisikymmentäviisi")
-      , (56, "viisikymmentäkuusi")
-      , (57, "viisikymmentäseitsemän")
-      , (58, "viisikymmentäkahdeksan")
-      , (59, "viisikymmentäyhdeksän")
-      , (60, "kuusikymmentä")
-      , (61, "kuusikymmentäyksi")
-      , (62, "kuusikymmentäkaksi")
-      , (63, "kuusikymmentäkolme")
-      , (64, "kuusikymmentäneljä")
-      , (65, "kuusikymmentäviisi")
-      , (66, "kuusikymmentäkuusi")
-      , (67, "kuusikymmentäseitsemän")
-      , (68, "kuusikymmentäkahdeksan")
-      , (69, "kuusikymmentäyhdeksän")
-      , (70, "seitsemänkymmentä")
-      , (71, "seitsemänkymmentäyksi")
-      , (72, "seitsemänkymmentäkaksi")
-      , (73, "seitsemänkymmentäkolme")
-      , (74, "seitsemänkymmentäneljä")
-      , (75, "seitsemänkymmentäviisi")
-      , (76, "seitsemänkymmentäkuusi")
-      , (77, "seitsemänkymmentäseitsemän")
-      , (78, "seitsemänkymmentäkahdeksan")
-      , (79, "seitsemänkymmentäyhdeksän")
-      , (80, "kahdeksankymmentä")
-      , (81, "kahdeksankymmentäyksi")
-      , (82, "kahdeksankymmentäkaksi")
-      , (83, "kahdeksankymmentäkolme")
-      , (84, "kahdeksankymmentäneljä")
-      , (85, "kahdeksankymmentäviisi")
-      , (86, "kahdeksankymmentäkuusi")
-      , (87, "kahdeksankymmentäseitsemän")
-      , (88, "kahdeksankymmentäkahdeksan")
-      , (89, "kahdeksankymmentäyhdeksän")
-      , (90, "yhdeksänkymmentä")
-      , (91, "yhdeksänkymmentäyksi")
-      , (92, "yhdeksänkymmentäkaksi")
-      , (93, "yhdeksänkymmentäkolme")
-      , (94, "yhdeksänkymmentäneljä")
-      , (95, "yhdeksänkymmentäviisi")
-      , (96, "yhdeksänkymmentäkuusi")
-      , (97, "yhdeksänkymmentäseitsemän")
-      , (98, "yhdeksänkymmentäkahdeksan")
-      , (99, "yhdeksänkymmentäyhdeksän")
-      , (100, "sata")
-      , (101, "satayksi")
-      , (123, "satakaksikymmentäkolme")
-      , (200, "kaksisataa")
-      , (300, "kolmesataa")
-      , (357, "kolmesataaviisikymmentäseitsemän")
-      , (400, "neljäsataa")
-      , (500, "viisisataa")
-      , (567, "viisisataakuusikymmentäseitsemän")
-      , (600, "kuusisataa")
-      , (700, "seitsemänsataa")
-      , (800, "kahdeksansataa")
-      , (900, "yhdeksänsataa")
-      , (999, "yhdeksänsataayhdeksänkymmentäyhdeksän")
-      , (1000, "tuhat")
-      , (1001, "tuhatyksi")
-      , (2000, "kaksituhatta")
-      , (3000, "kolmetuhatta")
-      , (3456, "kolmetuhattaneljäsataaviisikymmentäkuusi")
-      , (3721, "kolmetuhattaseitsemänsataakaksikymmentäyksi")
-      , (4000, "neljätuhatta")
-      , (5000, "viisituhatta")
-      , (6000, "kuusituhatta")
-      , (7000, "seitsemäntuhatta")
-      , (8000, "kahdeksantuhatta")
-      , (9000, "yhdeksäntuhatta")
-      , (10000, "kymmenentuhatta")
-      , (11000, "toistatuhatta")
-      , (12000, "toistakaksituhatta")
-      , (13000, "toistakolmetuhatta")
-      , (dec 5, "satatuhatta")
-      , (2 ⋅ dec 5, "kaksisataatuhatta")
-      , (dec 6, "miljoona")
-      , (dec 6 + 1, "miljoonayksi")
-      , (2 ⋅ dec 6, "kaksimiljoonaa")
-      , (32534756, "kolmekymmentäkaksimiljoonaaviisisataakolmekymmentäneljätuhattaseitsemänsataaviisikymmentäkuusi")
-      , (dec 9, "miljardi")
-      , (2 ⋅ dec 9, "kaksimiljardia")
-      , (3 ⋅ dec 9, "kolmemiljardia")
-      , (dec 12, "biljoona")
-      , (3 ⋅ dec 12, "kolmebiljoonaa")
-      ]
-    )
-  , ( "singular accusative"
-    , singular $ accusative defaultInflection
-    , [ (0, "nolla")
-      , (1, "yksi")
-      , (2, "kaksi")
-      , (3, "kolme")
-      , (4, "neljä")
-      , (5, "viisi")
-      , (6, "kuusi")
-      , (7, "seitsemän")
-      , (8, "kahdeksan")
-      , (9, "yhdeksän")
-      , (10, "kymmenen")
-      , (11, "yksitoista")
-      , (12, "kaksitoista")
-      , (13, "kolmetoista")
-      , (14, "neljätoista")
-      , (15, "viisitoista")
-      , (16, "kuusitoista")
-      , (17, "seitsemäntoista")
-      , (18, "kahdeksantoista")
-      , (19, "yhdeksäntoista")
-      , (20, "kaksikymmentä")
-      , (21, "kaksikymmentäyksi")
-      , (100, "sata")
-      , (1000, "tuhat")
-      ]
-    )
-  , ( "singular genitive"
-    , singular $ genitive defaultInflection
-    , [ (0, "nollan")
-      , (1, "yhden")
-      , (2, "kahden")
-      , (3, "kolmen")
-      , (4, "neljän")
-      , (5, "viiden")
-      , (6, "kuuden")
-      , (7, "seitsemän")
-      , (8, "kahdeksan")
-      , (9, "yhdeksän")
-      , (10, "kymmenen")
-      , (11, "yhdentoista")
-      , (12, "kahdentoista")
-      , (13, "kolmentoista")
-      , (14, "neljäntoista")
-      , (15, "viidentoista")
-      , (16, "kuudentoista")
-      , (17, "seitsemäntoista")
-      , (18, "kahdeksantoista")
-      , (19, "yhdeksäntoista")
-      , (20, "kahdenkymmenen")
-      , (21, "kahdenkymmenenyhden")
-      , (100, "sadan")
-      , (357, "kolmensadanviidenkymmenenseitsemän")
-      , (1000, "tuhannen")
-      ]
-    )
-  , ( "singular partitive"
-    , singular $ partitive defaultInflection
-    , [ (0, "nollaa")
-      , (1, "yhtä")
-      , (2, "kahta")
-      , (3, "kolmea")
-      , (4, "neljää")
-      , (5, "viittä")
-      , (6, "kuutta")
-      , (7, "seitsemää")
-      , (8, "kahdeksaa")
-      , (9, "yhdeksää")
-      , (10, "kymmentä")
-      , (11, "yhtätoista")
-      , (12, "kahtatoista")
-      , (13, "kolmeatoista")
-      , (14, "neljäätoista")
-      , (15, "viittätoista")
-      , (16, "kuuttatoista")
-      , (17, "seitsemäätoista")
-      , (18, "kahdeksaatoista")
-      , (19, "yhdeksäätoista")
-      , (20, "kahtakymmentä")
-      , (21, "kahtakymmentäyhtä")
-      , (100, "sataa")
-      , (357, "kolmeasataaviittäkymmentäseitsemää")
-      , (1000, "tuhatta")
-      ]
-    )
-  , ( "singular essive"
-    , singular $ essive defaultInflection
-    , [ (0, "nollana")
-      , (1, "yhtenä")
-      , (2, "kahtena")
-      , (3, "kolmena")
-      , (4, "neljänä")
-      , (5, "viitenä")
-      , (6, "kuutena")
-      , (7, "seitsemänä")
-      , (8, "kahdeksana")
-      , (9, "yhdeksänä")
-      , (10, "kymmenenä")
-      , (11, "yhtenätoista")
-      , (12, "kahtenatoista")
-      , (13, "kolmenatoista")
-      , (14, "neljänätoista")
-      , (15, "viitenätoista")
-      , (16, "kuutenatoista")
-      , (17, "seitsemänätoista")
-      , (18, "kahdeksanatoista")
-      , (19, "yhdeksänätoista")
-      , (20, "kahtenakymmenenä")
-      , (21, "kahdessakymmenessäyhdessä")
-      , (100, "satana")
-      , (357, "kolmenasatanaviitenäkymmenenäseitsemänä")
-      , (1000, "tuhantena")
-      ]
-    )
-  , ( "singular translative"
-    , singular $ translative defaultInflection
-    , [ (0, "nollaksi")
-      , (1, "yhdeksi")
-      , (2, "kahdeksi")
-      , (3, "kolmeksi")
-      , (4, "neljäksi")
-      , (5, "viideksi")
-      , (6, "kuudeksi")
-      , (7, "seitsemäksi")
-      , (8, "kahdeksaksi")
-      , (9, "yhdeksäksi")
-      , (10, "kymmeneksi")
-      , (11, "yhdeksitoista")
-      , (12, "kahdeksitoista")
-      , (13, "kolmeksitoista")
-      , (14, "neljäksitoista")
-      , (15, "viideksitoista")
-      , (16, "kuudeksitoista")
-      , (17, "seitsemäksitoista")
-      , (18, "kahdeksaksitoista")
-      , (19, "yhdeksäksitoista")
-      , (20, "kahdeksikymmeneksi")
-      , (21, "kahdeksikymmeneksiyhdeksi")
-      , (100, "sadaksi")
-      , (1000, "tuhanneksi")
-      ]
-    )
-  , ( "singular locative inessive"
-    , singular $ locativeInessive defaultInflection
-    , [ (0, "nollassa")
-      , (1, "yhdessä")
-      , (2, "kahdessa")
-      , (3, "kolmessa")
-      , (4, "neljässä")
-      , (5, "viidessä")
-      , (6, "kuudessa")
-      , (7, "seitsemässä")
-      , (8, "kahdeksassa")
-      , (9, "yhdeksässä")
-      , (10, "kymmenessä")
-      , (11, "yhdessätoista")
-      , (12, "kahdessatoista")
-      , (13, "kolmessatoista")
-      , (14, "neljässätoista")
-      , (15, "viidessätoista")
-      , (16, "kuudessatoista")
-      , (17, "seitsemässätoista")
-      , (18, "kahdeksassatoista")
-      , (19, "yhdeksässätoista")
-      , (20, "kahdessakymmenessä")
-      , (21, "kahdessakymmenessäyhdessä")
-      , (100, "sadassa")
-      , (1000, "tuhannessa")
-      ]
-    )
-  , ( "singular locative elative"
-    , singular $ locativeElative defaultInflection
-    , [ (0, "nollasta")
-      , (1, "yhdestä")
-      , (2, "kahdesta")
-      , (3, "kolmesta")
-      , (4, "neljästä")
-      , (5, "viidestä")
-      , (6, "kuudesta")
-      , (7, "seitsemästä")
-      , (8, "kahdeksasta")
-      , (9, "yhdeksästä")
-      , (10, "kymmenestä")
-      , (11, "yhdestätoista")
-      , (12, "kahdestatoista")
-      , (13, "kolmestatoista")
-      , (14, "neljästätoista")
-      , (15, "viidestätoista")
-      , (16, "kuudestatoista")
-      , (17, "seitsemästätoista")
-      , (18, "kahdeksastatoista")
-      , (19, "yhdeksästätoista")
-      , (20, "kahdestakymmenestä")
-      , (21, "kahdestakymmenestäyhdestä")
-      , (100, "sadasta")
-      , (1000, "tuhannesta")
-      ]
-    )
-  , ( "singular locative illative"
-    ,  singular $ locativeIllative defaultInflection
-    , [ (0, "nollaan")
-      , (1, "yhteen")
-      , (2, "kahteen")
-      , (3, "kolmeen")
-      , (4, "neljään")
-      , (5, "viiteen")
-      , (6, "kuuteen")
-      , (7, "seitsemään")
-      , (8, "kahdeksaan")
-      , (9, "yhdeksään")
-      , (10, "kymmeneen")
-      , (11, "yhteentoista")
-      , (12, "kahteentoista")
-      , (13, "kolmeentoista")
-      , (14, "neljääntoista")
-      , (15, "viiteentoista")
-      , (16, "kuuteentoista")
-      , (17, "seitsemääntoista")
-      , (18, "kahdeksaantoista")
-      , (19, "yhdeksääntoista")
-      , (20, "kahteenkymmeneen")
-      , (21, "kahteenkymmeneenyhteen")
-      , (100, "sataan")
-      , (1000, "tuhanteen")
-      ]
-    )
-  , ( "singular locative adessive"
-    , singular $ locativeAdessive defaultInflection
-    , [ (0, "nollalla")
-      , (1, "yhdellä")
-      , (2, "kahdella")
-      , (3, "kolmella")
-      , (4, "neljällä")
-      , (5, "viidellä")
-      , (6, "kuudella")
-      , (7, "seitsemällä")
-      , (8, "kahdeksalla")
-      , (9, "yhdeksällä")
-      , (10, "kymmenellä")
-      , (11, "yhdellätoista")
-      , (12, "kahdellatoista")
-      , (13, "kolmellatoista")
-      , (14, "neljällätoista")
-      , (15, "viidellätoista")
-      , (16, "kuudellatoista")
-      , (17, "seitsemällätoista")
-      , (18, "kahdeksallatoista")
-      , (19, "yhdeksällätoista")
-      , (20, "kahdellakymmenellä")
-      , (21, "kahdellakymmenelläyhdellä")
-      , (100, "sadalla")
-      , (1000, "tuhannella")
-      ]
-    )
-  , ( "singular locative ablative"
-    , singular $ locativeAblative defaultInflection
-    , [ (0, "nollalta")
-      , (1, "yhdeltä")
-      , (2, "kahdelta")
-      , (3, "kolmelta")
-      , (4, "neljältä")
-      , (5, "viideltä")
-      , (6, "kuudelta")
-      , (7, "seitsemältä")
-      , (8, "kahdeksalta")
-      , (9, "yhdeksältä")
-      , (10, "kymmeneltä")
-      , (11, "yhdeltätoista")
-      , (12, "kahdeltatoista")
-      , (13, "kolmeltatoista")
-      , (14, "neljältätoista")
-      , (15, "viideltätoista")
-      , (16, "kuudeltatoista")
-      , (17, "seitsemältätoista")
-      , (18, "kahdeksaltatoista")
-      , (19, "yhdeksältätoista")
-      , (20, "kahdeltakymmeneltä")
-      , (21, "kahdeltakymmeneltäyhdeltä")
-      , (100, "sadalta")
-      , (1000, "tuhannelta")
-      ]
-    )
-  , ( "singular locative allative"
-    , singular $ locativeAllative defaultInflection
-    , [ (0, "nollalle")
-      , (1, "yhdelle")
-      , (2, "kahdelle")
-      , (3, "kolmelle")
-      , (4, "neljälle")
-      , (5, "viidelle")
-      , (6, "kuudelle")
-      , (7, "seitsemälle")
-      , (8, "kahdeksalle")
-      , (9, "yhdeksälle")
-      , (10, "kymmenelle")
-      , (11, "yhdelletoista")
-      , (12, "kahdelletoista")
-      , (13, "kolmelletoista")
-      , (14, "neljälletoista")
-      , (15, "viidelletoista")
-      , (16, "kuudelletoista")
-      , (17, "seitsemälletoista")
-      , (18, "kahdeksalletoista")
-      , (19, "yhdeksälletoista")
-      , (20, "kahdellekymmenelle")
-      , (21, "kahdellekymmenelleyhdelle")
-      , (100, "sadalle")
-      , (1000, "tuhannelle")
-      ]
-    )
-  , ( "singular abessive"
-    , singular $ abessive defaultInflection
-    , [ (0, "nollatta")
-      , (1, "yhdettä")
-      , (2, "kahdetta")
-      , (3, "kolmetta")
-      , (4, "neljättä")
-      , (5, "viidettä")
-      , (6, "kuudetta")
-      , (7, "seitsemättä")
-      , (8, "kahdeksatta")
-      , (9, "yhdeksättä")
-      , (10, "kymmenettä")
-      , (11, "yhdettätoista")
-      , (12, "kahdettatoista")
-      , (13, "kolmettatoista")
-      , (14, "neljättätoista")
-      , (15, "viidettätoista")
-      , (16, "kuudettatoista")
-      , (17, "seitsemättätoista")
-      , (18, "kahdeksattatoista")
-      , (19, "yhdeksättätoista")
-      , (20, "kahdettakymmenettä")
-      , (21, "kahdettakymmenettäyhdettä")
-      , (100, "sadatta")
-      , (1000, "tuhannetta")
-      ]
-    )
-  , ( "singular super essive"
-    , singular $ superEssive defaultInflection
-    , [ (1, "yhtäällä")
-      , (2, "kahtaalla")
-      ]
-    )
-  , ( "singular delative"
-    , singular $ delative defaultInflection
-    , [ (1, "yhtäältä")
-      , (2, "kahtaalta")
-      ]
-    )
-  , ( "singular sublative"
-    , singular $ sublative defaultInflection
-    , [ (1, "yhtäälle")
-      , (2, "kahtaalle")
-      ]
-    )
-  , ( "singular lative"
-    , singular $ lative defaultInflection
-    , [ (1, "yhä")
-      , (2, "kahtia")
-      , (3, "kolmia")
-      ]
-    )
-  , ( "singular multiplicative"
-    , singular $ multiplicative defaultInflection
-    , [ (1, "yhdesti")
-      , (2, "kahdesti")
-      , (3, "kolmesti")
-      ]
-    )
-  , ( "plural nominative"
-    , plural $ nominative defaultInflection
-    , [ (0, "nollat")
-      , (1, "yhdet")
-      , (2, "kahdet")
-      , (3, "kolmet")
-      , (4, "neljät")
-      , (5, "viidet")
-      , (6, "kuudet")
-      , (7, "seitsemät")
-      , (8, "kahdeksat")
-      , (9, "yhdeksät")
-      , (10, "kymmenet")
-      , (11, "yhdettoista")
-      , (12, "kahdettoista")
-      , (13, "kolmettoista")
-      , (14, "neljättoista")
-      , (15, "viidettoista")
-      , (16, "kuudettoista")
-      , (17, "seitsemättoista")
-      , (18, "kahdeksattoista")
-      , (19, "yhdeksättoista")
-      , (20, "kahdetkymmenet")
-      , (21, "kahdetkymmenetyhdet")
-      , (100, "sadat")
-      , (1000, "tuhannet")
-      ]
-    )
-  , ( "plural accusative"
-    , plural $ accusative defaultInflection
-    , [ (0, "nollat")
-      , (1, "yhdet")
-      , (2, "kahdet")
-      , (3, "kolmet")
-      , (4, "neljät")
-      , (5, "viidet")
-      , (6, "kuudet")
-      , (7, "seitsemät")
-      , (8, "kahdeksat")
-      , (9, "yhdeksät")
-      , (10, "kymmenet")
-      , (11, "yhdettoista")
-      , (12, "kahdettoista")
-      , (13, "kolmettoista")
-      , (14, "neljättoista")
-      , (15, "viidettoista")
-      , (16, "kuudettoista")
-      , (17, "seitsemättoista")
-      , (18, "kahdeksattoista")
-      , (19, "yhdeksättoista")
-      , (20, "kahdetkymmenet")
-      , (21, "kahdetkymmenetyhdet")
-      , (100, "sadat")
-      , (1000, "tuhannet")
-      ]
-    )
-  , ( "plural genitive"
-    , plural $ genitive defaultInflection
-    , [ (0, "nollien")
-      , (1, "yksien")
-      , (2, "kaksien")
-      , (3, "kolmien")
-      , (4, "neljien")
-      , (5, "viisien")
-      , (6, "kuusien")
-      , (7, "seitsemien")
-      , (8, "kahdeksien")
-      , (9, "yhdeksien")
-      , (10, "kymmenien")
-      , (11, "yksientoista")
-      , (12, "kaksientoista")
-      , (13, "kolmientoista")
-      , (14, "neljientoista")
-      , (15, "viisientoista")
-      , (16, "kuusientoista")
-      , (17, "seitsemientoista")
-      , (18, "kahdeksientoista")
-      , (19, "yhdeksientoista")
-      , (20, "kaksienkymmenien")
-      , (21, "kaksienkymmenienyksien")
-      , (100, "satojen")
-      , (1000, "tuhansien")
-      ]
-    )
-  , ( "plural partitive"
-    , plural $ partitive defaultInflection
-    , [ (0, "nollia")
-      , (1, "yksiä")
-      , (2, "kaksia")
-      , (3, "kolmia")
-      , (4, "neljiä")
-      , (5, "viisiä")
-      , (6, "kuusia")
-      , (7, "seitsemiä")
-      , (8, "kahdeksia")
-      , (9, "yhdeksiä")
-      , (10, "kymmeniä")
-      , (11, "yksiätoista")
-      , (12, "kaksiatoista")
-      , (13, "kolmiatoista")
-      , (14, "neljiätoista")
-      , (15, "viittätoista")
-      , (16, "kuuttatoista")
-      , (17, "seitsemiätoista")
-      , (18, "kahdeksiatoista")
-      , (19, "yhdeksiätoista")
-      , (20, "kaksiakymmeniä")
-      , (21, "kaksiakymmeniäyksiä")
-      , (100, "satoja")
-      , (1000, "tuhansia")
-      ]
-    )
-  , ( "plural essive"
-    , plural $ essive defaultInflection
-    , [ (0, "nollina")
-      , (1, "yksinä")
-      , (2, "kaksina")
-      , (3, "kolmina")
-      , (4, "neljinä")
-      , (5, "viisinä")
-      , (6, "kuusina")
-      , (7, "seitseminä")
-      , (8, "kahdeksina")
-      , (9, "yhdeksinä")
-      , (10, "kymmeninä")
-      , (11, "yksinätoista")
-      , (12, "kaksinatoista")
-      , (13, "kolminatoista")
-      , (14, "neljinätoista")
-      , (15, "viitenätoista")
-      , (16, "kuutenatoista")
-      , (17, "seitseminätoista")
-      , (18, "kahdeksinatoista")
-      , (19, "yhdeksinätoista")
-      , (20, "kaksinakymmeninä")
-      , (21, "kaksinakymmeninäyksinä")
-      , (100, "satoina")
-      , (1000, "tuhansina")
-      ]
-    )
-  , ( "plural translative"
-    , plural $ translative defaultInflection
-    , [ (0, "nolliksi")
-      , (1, "yksiksi")
-      , (2, "kaksiksi")
-      , (3, "kolmiksi")
-      , (4, "neljiksi")
-      , (5, "viisiksi")
-      , (6, "kuusiksi")
-      , (7, "seitsemiksi")
-      , (8, "kahdeksiksi")
-      , (9, "yhdeksiksi")
-      , (10, "kymmeniksi")
-      , (11, "yksiksitoista")
-      , (12, "kaksiksitoista")
-      , (13, "kolmiksitoista")
-      , (14, "neljiksitoista")
-      , (15, "viideksitoista")
-      , (16, "kuudeksitoista")
-      , (17, "seitsemiksitoista")
-      , (18, "kahdeksiksitoista")
-      , (19, "yhdeksiksitoista")
-      , (20, "kaksiksikymmeniksi")
-      , (21, "kaksiksikymmeniksiyksiksi")
-      , (100, "sadoiksi")
-      , (1000, "tuhansiksi")
-      ]
-    )
-  , ( "plural locative inessive"
-    , plural $ locativeInessive defaultInflection
-    , [ (0, "nollissa")
-      , (1, "yksissä")
-      , (2, "kaksissa")
-      , (3, "kolmissa")
-      , (4, "neljissä")
-      , (5, "viisissä")
-      , (6, "kuusissa")
-      , (7, "seitsemissä")
-      , (8, "kahdeksissa")
-      , (9, "yhdeksissä")
-      , (10, "kymmenissä")
-      , (11, "yksissätoista")
-      , (12, "kaksissatoista")
-      , (13, "kolmissatoista")
-      , (14, "neljissätoista")
-      , (15, "viidessätoista")
-      , (16, "kuudessatoista")
-      , (17, "seitsemissätoista")
-      , (18, "kahdeksissatoista")
-      , (19, "yhdeksissätoista")
-      , (20, "kaksissakymmenissä")
-      , (21, "kaksissakymmenissäyksissä")
-      , (100, "sadoissa")
-      , (1000, "tuhansissa")
-      ]
-    )
-  , ( "plural locative elative"
-    , plural $ locativeElative defaultInflection
-    , [ (0, "nollista")
-      , (1, "yksistä")
-      , (2, "kaksista")
-      , (3, "kolmista")
-      , (4, "neljistä")
-      , (5, "viisistä")
-      , (6, "kuusista")
-      , (7, "seitsemistä")
-      , (8, "kahdeksista")
-      , (9, "yhdeksistä")
-      , (10, "kymmenistä")
-      , (11, "yksistätoista")
-      , (12, "kaksistatoista")
-      , (13, "kolmistatoista")
-      , (14, "neljistätoista")
-      , (15, "viidestätoista")
-      , (16, "kuudestatoista")
-      , (17, "seitsemistätoista")
-      , (18, "kahdeksistatoista")
-      , (19, "yhdeksistätoista")
-      , (20, "kaksistakymmenistä")
-      , (21, "kaksistakymmenistäyksistä")
-      , (100, "sadoista")
-      , (1000, "tuhansista")
-      ]
-    )
-  , ( "plural locative illative"
-    , plural $ locativeIllative defaultInflection
-    , [ (0, "nolliin")
-      , (1, "yksiin")
-      , (2, "kaksiin")
-      , (3, "kolmiin")
-      , (4, "neljiin")
-      , (5, "viisiin")
-      , (6, "kuusiin")
-      , (7, "seitsemiin")
-      , (8, "kahdeksiin")
-      , (9, "yhdeksiin")
-      , (10, "kymmeniin")
-      , (11, "yksiintoista")
-      , (12, "kaksiintoista")
-      , (13, "kolmiintoista")
-      , (14, "neljiintoista")
-      , (15, "viiteentoista")
-      , (16, "kuuteentoista")
-      , (17, "seitsemiintoista")
-      , (18, "kahdeksiintoista")
-      , (19, "yhdeksiintoista")
-      , (20, "kaksiinkymmeniin")
-      , (21, "kaksiinkymmeniinyksiin")
-      , (100, "satoihin")
-      , (1000, "tuhansiin")
-      ]
-    )
-  , ( "plural locative adessive"
-    , plural $ locativeAdessive defaultInflection
-    , [ (0, "nollilla")
-      , (1, "yksillä")
-      , (2, "kaksilla")
-      , (3, "kolmilla")
-      , (4, "neljillä")
-      , (5, "viisillä")
-      , (6, "kuusilla")
-      , (7, "seitsemillä")
-      , (8, "kahdeksilla")
-      , (9, "yhdeksillä")
-      , (10, "kymmenillä")
-      , (11, "yksillätoista")
-      , (12, "kaksillatoista")
-      , (13, "kolmillatoista")
-      , (14, "neljillätoista")
-      , (15, "viidellätoista")
-      , (16, "kuudellatoista")
-      , (17, "seitsemillätoista")
-      , (18, "kahdeksillatoista")
-      , (19, "yhdeksillätoista")
-      , (20, "kaksillakymmenillä")
-      , (21, "kaksillakymmenilläyksillä")
-      , (100, "sadoilla")
-      , (1000, "tuhansilla")
-      ]
-    )
-  , ( "plural locative ablative"
-    , plural $ locativeAblative defaultInflection
-    , [ (0, "nollilta")
-      , (1, "yksiltä")
-      , (2, "kaksilta")
-      , (3, "kolmilta")
-      , (4, "neljiltä")
-      , (5, "viisiltä")
-      , (6, "kuusilta")
-      , (7, "seitsemiltä")
-      , (8, "kahdeksilta")
-      , (9, "yhdeksiltä")
-      , (10, "kymmeniltä")
-      , (11, "yksiltätoista")
-      , (12, "kaksiltatoista")
-      , (13, "kolmiltatoista")
-      , (14, "neljiltätoista")
-      , (15, "viideltätoista")
-      , (16, "kuudeltatoista")
-      , (17, "seitsemiltätoista")
-      , (18, "kahdeksiltatoista")
-      , (19, "yhdeksiltätoista")
-      , (20, "kaksiltakymmeniltä")
-      , (21, "kaksiltakymeniltäyksiltä")
-      , (100, "sadoilta")
-      , (1000, "tuhansilta")
-      ]
-    )
-  , ( "plural locative allative"
-    , plural $ locativeAllative defaultInflection
-    , [ (0, "nollille")
-      , (1, "yksille")
-      , (2, "kaksille")
-      , (3, "kolmille")
-      , (4, "neljille")
-      , (5, "viisille")
-      , (6, "kuusille")
-      , (7, "seitsemille")
-      , (8, "kahdeksille")
-      , (9, "yhdeksille")
-      , (10, "kymmenille")
-      , (11, "yksilletoista")
-      , (12, "kaksilletoista")
-      , (13, "kolmilletoista")
-      , (14, "neljilletoista")
-      , (15, "viidelletoista")
-      , (16, "kuudelletoista")
-      , (17, "seitsemilletoista")
-      , (18, "kahdeksilletoista")
-      , (19, "yhdeksilletoista")
-      , (20, "kaksillekymmenille")
-      , (21, "kaksillekymmenilleyksille")
-      , (100, "sadoille")
-      , (1000, "tuhansille")
-      ]
-    )
-  , ( "plural abessive"
-    , plural $ abessive defaultInflection
-    , [ (0, "nollitta")
-      , (1, "yksittä")
-      , (2, "kaksitta")
-      , (3, "kolmitta")
-      , (4, "neljittä")
-      , (5, "viisittä")
-      , (6, "kuusitta")
-      , (7, "seitsemittä")
-      , (8, "kahdeksitta")
-      , (9, "yhdeksittä")
-      , (10, "kymmenittä")
-      , (11, "yksittätoista")
-      , (12, "kaksittatoista")
-      , (13, "kolmittatoista")
-      , (14, "neljittätoista")
-      , (15, "viidettätoista")
-      , (16, "kuudettatoista")
-      , (17, "seitsemittätoista")
-      , (18, "kahdeksittatoista")
-      , (19, "yhdeksittätoista")
-      , (20, "kaksittakymmenittä")
-      , (21, "kaksittakymmenittäyksittä")
-      , (100, "sadoitta")
-      , (1000, "tuhansitta")
-      ]
-    )
-  , ( "plural comitative"
-    , plural $ comitative defaultInflection
-    , [ (0, "nolline")
-      , (1, "yksine")
-      , (2, "kaksine")
-      , (3, "kolmine")
-      , (4, "neljine")
-      , (5, "viisine")
-      , (6, "kuusine")
-      , (7, "seitsemine")
-      , (8, "kahdeksine")
-      , (9, "yhdeksine")
-      , (10, "kymmenine")
-      , (11, "yksinetoista")
-      , (12, "kaksinetoista")
-      , (13, "kolminetoista")
-      , (14, "neljinetoista")
-      , (15, "viisinetoista")
-      , (16, "kuusinetoista")
-      , (17, "seitseminetoista")
-      , (18, "kahdeksinetoista")
-      , (19, "yhdeksinetoista")
-      , (20, "kaksinekymmenine")
-      , (21, "kaksinekymmenineyksine")
-      , (100, "satoine")
-      , (1000, "tuhansine")
-      ]
-    )
-  , ( "plural instructive"
-    , plural $ instructive defaultInflection
-    , [ (0, "nollin")
-      , (1, "yksin")
-      , (2, "kaksin")
-      , (3, "kolmin")
-      , (4, "neljin")
-      , (5, "viisin")
-      , (6, "kuusin")
-      , (7, "seitsemin")
-      , (8, "kahdeksin")
-      , (9, "yhdeksin")
-      , (10, "kymmenin")
-      , (11, "yksintoista")
-      , (12, "kaksintoista")
-      , (13, "kolmintoista")
-      , (14, "neljintoista")
-      , (15, "viisintoista")
-      , (16, "kuusintoista")
-      , (17, "seitsemintoista")
-      , (18, "kahdeksintoista")
-      , (19, "yhdeksintoista")
-      , (20, "kaksinkymmenin")
-      , (21, "kaksinkymmeninyksin")
-      , (100, "sadoin")
-      , (1000, "tuhansin")
-      ]
-    )
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals =
-  [ ( "singular nominative"
-    , singular $ nominative defaultInflection
-    , [ (0, "nollas")
-      , (1, "ensimmäinen")
-      , (2, "toinen")
-      , (3, "kolmas")
-      , (4, "neljäs")
-      , (5, "viides")
-      , (6, "kuudes")
-      , (7, "seitsemäs")
-      , (8, "kahdeksas")
-      , (9, "yhdeksäs")
-      , (10, "kymmenes")
-      , (11, "yhdestoista")
-      , (12, "kahdestoista")
-      , (13, "kolmastoista")
-      , (14, "neljästoista")
-      , (15, "viidestoista")
-      , (16, "kuudestoista")
-      , (17, "seitsemästoista")
-      , (18, "kahdeksastoista")
-      , (19, "yhdeksästoista")
-      , (20, "kahdeskymmenes")
-      , (21, "kahdeskymmenesensimmäinen") -- also kahdeskymmenesyhdes
-      , (22, "kahdeskymmenestoinen") -- also kahdeskymmeneskahdes
-      , (23, "kahdeskymmeneskolmas")
-      , (24, "kahdeskymmenesneljäs")
-      , (25, "kahdeskymmenesviides")
-      , (26, "kahdeskymmeneskuudes")
-      , (27, "kahdeskymmenesseitsemäs")
-      , (28, "kahdeskymmeneskahdeksas")
-      , (29, "kahdeskymmenesyhdeksäs")
-      , (30, "kolmaskymmenes")
-      , (40, "neljäskymmenes")
-      , (50, "viideskymmenes")
-      , (60, "kuudeskymmenes")
-      , (70, "seitsemäskymmenes")
-      , (80, "kahdeksaskymmenes")
-      , (90, "yhdeksäskymmenes")
-      , (100, "sadas")
-      , (101, "sadasensimmäinen")
-      , (357, "kolmassadasviideskymmenesseitsemäs")
-      , (1000, "tuhannes")
-      , (1001, "tuhannesensimmäinen")
-      , (3721, "kolmastuhannesseitsemässadaskahdeskymmenesensimmäinen")
-      ]
-    )
-  , ( "singular accusative"
-    , singular $ accusative defaultInflection
-    , [ (0, "nollas")
-      , (1, "ensimmäinen")
-      , (2, "toinen")
-      , (3, "kolmas")
-      , (4, "neljäs")
-      , (5, "viides")
-      , (6, "kuudes")
-      , (7, "seitsemäs")
-      , (8, "kahdeksas")
-      , (9, "yhdeksäs")
-      , (10, "kymmenes")
-      , (11, "yhdestoista")
-      , (12, "kahdestoista")
-      , (13, "kolmastoista")
-      , (14, "neljästoista")
-      , (15, "viidestoista")
-      , (16, "kuudestoista")
-      , (17, "seitsemästoista")
-      , (18, "kahdeksastoista")
-      , (19, "yhdeksästoista")
-      , (20, "kahdeskymmenes")
-      , (21, "kahdeskymmenesensimmäinen")
-      , (100, "sadas")
-      , (1000, "tuhannes")
-      ]
-    )
-  , ( "singular genitive"
-    , singular $ genitive defaultInflection
-    , [ (0, "nollannen")
-      , (1, "ensimmäisen")
-      , (2, "toisen")
-      , (3, "kolmannen")
-      , (4, "neljännen")
-      , (5, "viidennen")
-      , (6, "kuudennen")
-      , (7, "seitsemännen")
-      , (8, "kahdeksannen")
-      , (9, "yhdeksännen")
-      , (10, "kymmenennen")
-      , (11, "yhdennentoista")
-      , (12, "kahdennentoista")
-      , (13, "kolmannentoista")
-      , (14, "neljännentoista")
-      , (15, "viidennentoista")
-      , (16, "kuudennentoista")
-      , (17, "seitsemännentoista")
-      , (18, "kahdeksannentoista")
-      , (19, "yhdeksännentoista")
-      , (20, "kahdennenkymmenennen")
-      , (21, "kahdennenkymmenennenensimmäisen")
-      , (100, "sadannen")
-      , (357, "kolmannensadannenviidennenkymmenennenseitsemännen")
-      , (1000, "tuhannennen")
-      ]
-    )
-  , ( "singular partitive"
-    , singular $ partitive defaultInflection
-    , [ (0, "nollatta")
-      , (1, "ensimmäistä")
-      , (2, "toista")
-      , (3, "kolmatta")
-      , (4, "neljättä")
-      , (5, "viidettä")
-      , (6, "kuudetta")
-      , (7, "seitsemättä")
-      , (8, "kahdeksatta")
-      , (9, "yhdeksättä")
-      , (10, "kymmenettä")
-      , (11, "yhdettätoista")
-      , (12, "kahdettatoista")
-      , (13, "kolmattatoista")
-      , (14, "neljättätoista")
-      , (15, "viidettätoista")
-      , (16, "kuudettatoista")
-      , (17, "seitsemättätoista")
-      , (18, "kahdeksattatoista")
-      , (19, "yhdeksättätoista")
-      , (20, "kahdettakymmenettä")
-      , (21, "kahdettakymmenettäensimmäistä")
-      , (100, "sadatta")
-      , (357, "kolmattasadattaviidettäkymmenettäseitsemätta")
-      , (1000, "tuhannetta")
-      ]
-    )
-  , ( "singular essive"
-    , singular $ essive defaultInflection
-    , [ (0, "nollantena")
-      , (1, "ensimmmäisenä")
-      , (2, "toisena")
-      , (3, "kolmantena")
-      , (4, "neljäntenä")
-      , (5, "viidentenä")
-      , (6, "kuudentena")
-      , (7, "seitsemäntenä")
-      , (8, "kahdeksantena")
-      , (9, "yhdeksäntenä")
-      , (10, "kymmenentenä")
-      , (11, "yhdennessätoista")
-      , (12, "kahdentenatoista")
-      , (13, "kolmantenatoista")
-      , (14, "neljäntenätoista")
-      , (15, "viidentenätoista")
-      , (16, "kuudentenatoista")
-      , (17, "seitsemäntenätoista")
-      , (18, "kahdeksantenatoista")
-      , (19, "yhdeksäntenätoista")
-      , (20, "kahdentenakymmenentenä")
-      , (21, "kahdentenakymmenentenäensimmäisenä")
-      , (100, "sadantena")
-      , (357, "kolmantenasadantenaviidentenäkymmenentenäseitsemäntenä")
-      , (1000, "tuhannentena")
-      ]
-    )
-  , ( "singular translative"
-    , singular $ translative defaultInflection
-    , [ (0, "nollanneksi")
-      , (1, "ensimmäiseksi")
-      , (2, "toiseksi")
-      , (3, "kolmanneksi")
-      , (4, "neljänneksi")
-      , (5, "viidenneksi")
-      , (6, "kuudenneksi")
-      , (7, "seitsemänneksi")
-      , (8, "kahdeksanneksi")
-      , (9, "yhdeksänneksi")
-      , (10, "kymmenenneksi")
-      , (11, "yhdenneksitoista")
-      , (12, "kahdenneksitoista")
-      , (13, "kolmanneksitoista")
-      , (14, "neljänneksitoista")
-      , (15, "viidenneksitoista")
-      , (16, "kuudenneksitoista")
-      , (17, "seitsemänneksitoista")
-      , (18, "kahdenksanneksitoista")
-      , (19, "yhdeksänneksitoista")
-      , (20, "kahdenneksikymmenenneksi")
-      , (21, "kahdenneksikymmenenneksiensimmäiseksi")
-      , (100, "sadanneksi")
-      , (1000, "tuhannenneksi")
-      ]
-    )
-  , ( "singular locative inessive"
-    , singular $ locativeInessive defaultInflection
-    , [ (0, "nollannessa")
-      , (1, "ensimmäisessä")
-      , (2, "toisessa")
-      , (3, "kolmannessa")
-      , (4, "neljännessä")
-      , (5, "viidennessä")
-      , (6, "kuudennessa")
-      , (7, "seitsemännessä")
-      , (8, "kahdeksannessa")
-      , (9, "yhdeksännessä")
-      , (10, "kymmenennessä")
-      , (11, "yhdennessätoista")
-      , (12, "kahdennessatoista")
-      , (13, "kolmannessatoista")
-      , (14, "neljännessätoista")
-      , (15, "viidennessätoista")
-      , (16, "kuudennessatoista")
-      , (17, "seitsemännessätoista")
-      , (18, "kahdeksannessatoista")
-      , (19, "yhdeksännessätoista")
-      , (20, "kahdennessakymmenennessä")
-      , (21, "kahdennessakymmenennessäensimmäisessä")
-      , (100, "sadannessa")
-      , (1000, "tuhannennessa")
-      ]
-    )
-  , ( "singular locative elative"
-    , singular $ locativeElative defaultInflection
-    , [ (0, "nollannesta")
-      , (1, "ensimmäisestä")
-      , (2, "toisesta")
-      , (3, "kolmannesta")
-      , (4, "neljännestä")
-      , (5, "viidennestä")
-      , (6, "kuudennesta")
-      , (7, "seitsemännestä")
-      , (8, "kahdeksannesta")
-      , (9, "yhdeksännestä")
-      , (10, "kymmenennestä")
-      , (11, "yhdennestätoista")
-      , (12, "kahdennestatoista")
-      , (13, "kolmannestatoista")
-      , (14, "neljännestätoista")
-      , (15, "viidennestätoista")
-      , (16, "kuudennestatoista")
-      , (17, "seitsemännestätoista")
-      , (18, "kahdeksannestatoista")
-      , (19, "yhdeksännestätoista")
-      , (20, "kahdennestakymmenennestä")
-      , (21, "kahdennestakymmenennestäensimmäisestä")
-      , (100, "sadannesta")
-      , (1000, "tuhannennesta")
-      ]
-    )
-  , ( "singular locative illative"
-    , singular $ locativeIllative defaultInflection
-    , [ (0, "nollanteen")
-      , (1, "ensimmäiseen")
-      , (2, "toiseen")
-      , (3, "kolmanteen")
-      , (4, "neljänteen")
-      , (5, "viidenteen")
-      , (6, "kuudenteen")
-      , (7, "seitsemänteen")
-      , (8, "kahdeksanteen")
-      , (9, "yhdeksänteen")
-      , (10, "kymmenenteen")
-      , (11, "yhdenteentoista")
-      , (12, "kahdenteentoista")
-      , (13, "kolmanteentoista")
-      , (14, "neljänteentoista")
-      , (15, "viidenteentoista")
-      , (16, "kuudenteentoista")
-      , (17, "seitsemänteentoista")
-      , (18, "kahdeksanteentoista")
-      , (19, "yhdeksänteentoista")
-      , (20, "kahdenteenkymmenenteen")
-      , (21, "kahdenteenkymmenenteenensimmäiseen")
-      , (100, "sadanteen")
-      , (1000, "tuhannenteen")
-      ]
-    )
-  , ( "singular locative adessive"
-    , singular $ locativeAdessive defaultInflection
-    , [ (0, "nollannella")
-      , (1, "ensimmäisellä")
-      , (2, "toisella")
-      , (3, "kolmannella")
-      , (4, "neljännellä")
-      , (5, "viidennellä")
-      , (6, "kuudennella")
-      , (7, "seitsemännellä")
-      , (8, "kahdeksannella")
-      , (9, "yhdeksännellä")
-      , (10, "kymmenennellä")
-      , (11, "yhdennellätoista")
-      , (12, "kahdennellatoista")
-      , (13, "kolmannellatoista")
-      , (14, "neljännellätoista")
-      , (15, "viidennellätoista")
-      , (16, "kuudennellatoista")
-      , (17, "seitsemännellätoista")
-      , (18, "kahdeksannellatoista")
-      , (19, "yhdeksännellätoista")
-      , (20, "kahdennellakymmenennellä")
-      , (21, "kahdennellakymmenennelläensimmäisellä")
-      , (100, "sadannella")
-      , (1000, "tuhannennella")
-      ]
-    )
-  , ( "singular locative ablative"
-    , singular $ locativeAblative defaultInflection
-    , [ (0, "nollannelta")
-      , (1, "ensimmäiseltä")
-      , (2, "toiselta")
-      , (3, "kolmannelta")
-      , (4, "neljänneltä")
-      , (5, "viidenneltä")
-      , (6, "kuudennelta")
-      , (7, "seitsemänneltä")
-      , (8, "kahdeksannelta")
-      , (9, "yhdeksänneltä")
-      , (10, "kymmenenneltä")
-      , (11, "yhdenneltätoista")
-      , (12, "kahdenneltatoista")
-      , (13, "kolmanneltatoista")
-      , (14, "neljänneltätoista")
-      , (15, "viidenneltätoista")
-      , (16, "kuudenneltatoista")
-      , (17, "seitsemänneltätoista")
-      , (18, "kahdeksanneltatoista")
-      , (19, "yhdeksänneltätoista")
-      , (20, "kahdenneltakymmenenneltä")
-      , (21, "kahdenneltakymmenenneltäensimmäiseltä")
-      , (100, "sadannelta")
-      , (1000, "tuhannennelta")
-      ]
-    )
-  , ( "singular locative allative"
-    , singular $ locativeAllative defaultInflection
-    , [ (0, "nollannelle")
-      , (1, "ensimmäiselle")
-      , (2, "toiselle")
-      , (3, "kolmannelle")
-      , (4, "neljännelle")
-      , (5, "viidennelle")
-      , (6, "kuudennelle")
-      , (7, "seitsemännelle")
-      , (8, "kahdeksannelle")
-      , (9, "yhdeksännelle")
-      , (10, "kymmenennelle")
-      , (11, "yhdennelletoista")
-      , (12, "kahdennelletoista")
-      , (13, "kolmannelletoista")
-      , (14, "neljännelletoista")
-      , (15, "viidennelletoista")
-      , (16, "kuudennelletoista")
-      , (17, "seitsemännelletoista")
-      , (18, "kahdeksannelletoista")
-      , (19, "yhdeksännelletoista")
-      , (20, "kahdennellekymmenennelle")
-      , (21, "kahdennellekymmenennelleensimmäiselle")
-      , (100, "sadannelle")
-      , (1000, "tuhannennelle")
-      ]
-    )
-  , ( "singular abessive"
-    , singular $ abessive defaultInflection
-    , [ (0, "nollannetta")
-      , (1, "ensimmäisettä")
-      , (2, "toisetta")
-      , (3, "kolmannetta")
-      , (4, "neljännettä")
-      , (5, "viidennettä")
-      , (6, "kuudennetta")
-      , (7, "seitsemännettä")
-      , (8, "kahdeksannetta")
-      , (9, "yhdeksännettä")
-      , (10, "kymmenennettä")
-      , (11, "yhdennettätoista")
-      , (12, "kahdennettatoista")
-      , (13, "kolmannettatoista")
-      , (14, "neljännettätoista")
-      , (15, "viidennettätoista")
-      , (16, "kuudennettatoista")
-      , (17, "seitsemännettätoista")
-      , (18, "kahdeksannettatoista")
-      , (19, "yhdeksännettätoista")
-      , (20, "kahdennettakymmenennettä")
-      , (21, "kahdennettakymmenennettäensimmäisettä")
-      , (100, "sadannetta")
-      , (1000, "tuhannennetta")
-      ]
-    )
-  , ( "singular comitative"
-    , singular $ comitative defaultInflection
-    , [ (4, "neljänsine") ]
-    )
-  , ( "singular instructive"
-    , singular $ instructive defaultInflection
-    , [ (4, "neljänsin") ]
-    )
-  , ( "plural nominative"
-    , plural $ nominative defaultInflection
-    , [ (0, "nollannet")
-      , (1, "ensimmäiset")
-      , (2, "toiset")
-      , (3, "kolmannet")
-      , (4, "neljännet")
-      , (5, "viidennet")
-      , (6, "kuudennet")
-      , (7, "seitsemännet")
-      , (8, "kahdeksannet")
-      , (9, "yhdeksännet")
-      , (10, "kymmenennet")
-      , (11, "yhdennettoista")
-      , (12, "kahdennettoista")
-      , (13, "kolmannettoista")
-      , (14, "neljännettoista")
-      , (15, "viidennettoista")
-      , (16, "kuudennettoista")
-      , (17, "seitsemännettoista")
-      , (18, "kahdeksannettoista")
-      , (19, "yhdeksännettoista")
-      , (20, "kahdennetkymmenennet")
-      , (21, "kahdennetkymmenennetensimmäiset")
-      , (100, "sadannet")
-      , (1000, "tuhannennet")
-      ]
-    )
-  , ( "plural accusative"
-    , plural $ accusative defaultInflection
-    , [ (0, "nollannet")
-      , (1, "ensimmäiset")
-      , (2, "toiset")
-      , (3, "kolmannet")
-      , (4, "neljännet")
-      , (5, "viidennet")
-      , (6, "kuudennet")
-      , (7, "seitsemännet")
-      , (8, "kahdeksannet")
-      , (9, "yhdeksännet")
-      , (10, "kymmenennet")
-      , (11, "yhdennettoista")
-      , (12, "kahdennettoista")
-      , (13, "kolmannettoista")
-      , (14, "neljännettoista")
-      , (15, "viidennettoista")
-      , (16, "kuudennettoista")
-      , (17, "seitsemännettoista")
-      , (18, "kahdeksannettoista")
-      , (19, "yhdeksännettoista")
-      , (20, "kahdennetkymmenennet")
-      , (21, "kahdennetkymmenennetensimmäiset")
-      , (100, "sadannet")
-      , (1000, "tuhannennet")
-      ]
-    )
-  , ( "plural genitive"
-    , plural $ genitive defaultInflection
-    , [ (0, "nollansien")
-      , (1, "ensimmäisten")
-      , (2, "toisten")
-      , (3, "kolmansien")
-      , (4, "neljänsien")
-      , (5, "viidensien")
-      , (6, "kuudensien")
-      , (7, "seitsemänsien")
-      , (8, "kahdeksansien")
-      , (9, "yhdeksänsien")
-      , (10, "kymmenensien")
-      , (11, "yhdensientoista")
-      , (12, "kahdensientoista")
-      , (13, "kolmansientoista")
-      , (14, "neljänsientoista")
-      , (15, "viidensientoista")
-      , (16, "kuudensientoista")
-      , (17, "seitsemänsientoista")
-      , (18, "kahdeksansientoista")
-      , (19, "yhdeksänsientoista")
-      , (20, "kahdensienkymmenensien")
-      , (21, "kahdensienkymmenensienensimmäisten")
-      , (100, "sadansien")
-      , (1000, "tuhannensien")
-      ]
-    )
-  , ( "plural partitive"
-    , plural $ partitive defaultInflection
-    , [ (0, "nollansia")
-      , (1, "ensimmäisiä")
-      , (2, "toisia")
-      , (3, "kolmansia")
-      , (4, "neljänsiä")
-      , (5, "viidensiä")
-      , (6, "kuudensia")
-      , (7, "seitsemänsiä")
-      , (8, "kahdeksansia")
-      , (9, "yhdeksänsiä")
-      , (10, "kymmenensiä")
-      , (11, "yhdensiätoista")
-      , (12, "kahdensiatoista")
-      , (13, "kolmansiatoista")
-      , (14, "neljänsiätoista")
-      , (15, "viidensiätoista")
-      , (16, "kuudensiatoista")
-      , (17, "seitsemänsiätoista")
-      , (18, "kahdeksansiatoista")
-      , (19, "yhdeksänsiätoista")
-      , (20, "kahdensiakymmenensiä")
-      , (21, "kahdensiakymmenensiäensimmäisiä")
-      , (100, "sadansia")
-      , (1000, "tuhannensia")
-      ]
-    )
-  , ( "plural essive"
-    , plural $ essive defaultInflection
-    , [ (0, "nollansina")
-      , (1, "ensimmäisinä")
-      , (2, "toisina")
-      , (3, "kolmansina")
-      , (4, "neljänsinä")
-      , (5, "viidensinä")
-      , (6, "kuudensina")
-      , (7, "seitsemänsinä")
-      , (8, "kahdeksansina")
-      , (9, "yhdeksänsinä")
-      , (10, "kymmenensinä")
-      , (11, "yhdensinätoista")
-      , (12, "kahdensinatoista")
-      , (13, "kolmansinatoista")
-      , (14, "neljänsinätoista")
-      , (15, "viidensinätoista")
-      , (16, "kuudensinatoista")
-      , (17, "seitsemänsinätoista")
-      , (18, "kahdeksansinatoista")
-      , (19, "yhdeksänsinätoista")
-      , (20, "kahdensinakymmenensinä")
-      , (21, "kahdensinakymmenensinäensimmäisinä")
-      , (100, "sadansina")
-      , (1000, "tuhannensina")
-      ]
-    )
-  , ( "plural translative"
-    , plural $ translative defaultInflection
-    , [ (0, "nollansiksi")
-      , (1, "ensimmäisiksi")
-      , (2, "toisiksi")
-      , (3, "kolmansiksi")
-      , (4, "neljänsiksi")
-      , (5, "viidensiksi")
-      , (6, "kuudensiksi")
-      , (7, "seitsemänsiksi")
-      , (8, "kahdeksansiksi")
-      , (9, "yhdeksänsiksi")
-      , (10, "kymmenensiksi")
-      , (11, "yhdensiksitoista")
-      , (12, "kahdensiksitoista")
-      , (13, "kolmansiksitoista")
-      , (14, "neljänsiksitoista")
-      , (15, "viidensiksitoista")
-      , (16, "kuudensiksitoista")
-      , (17, "seitsemänsiksitoista")
-      , (18, "kahdeksansiksitoista")
-      , (19, "yhdeksänsissätoista")
-      , (20, "kahdensiksikymmenensiksi")
-      , (21, "kahdensiksikymmenensiksiensimmäisiksi")
-      , (100, "sadansiksi")
-      , (1000, "tuhannensiksi")
-      ]
-    )
-  , ( "plural locative inessive"
-    , plural $ locativeInessive defaultInflection
-    , [ (0, "nollansissa")
-      , (1, "ensimmäisissä")
-      , (2, "toisissa")
-      , (3, "kolmansissa")
-      , (4, "neljänsissä")
-      , (5, "viidensissä")
-      , (6, "kuudensissa")
-      , (7, "seitsemänsissä")
-      , (8, "kahdeksansissa")
-      , (9, "yhdeksänsissä")
-      , (10, "kymmenensissä")
-      , (11, "yhdensissätoista")
-      , (12, "kahdensissatoista")
-      , (13, "kolmansissatoista")
-      , (14, "neljänsissätoista")
-      , (15, "viidensissätoista")
-      , (16, "kuudensissatoista")
-      , (17, "seitsemänsissätoista")
-      , (18, "kahdeksansissatoista")
-      , (19, "yhdeksänsissätoista")
-      , (20, "kahdensissakymmenensissä")
-      , (21, "kahdensissakymmenensissäensimmäisissä")
-      , (100, "sadansissa")
-      , (1000, "tuhannensissa")
-      ]
-    )
-  , ( "plural locative elative"
-    , plural $ locativeElative defaultInflection
-    , [ (0, "nollansista")
-      , (1, "ensimmäisistä")
-      , (2, "toisista")
-      , (3, "kolmansista")
-      , (4, "neljänsistä")
-      , (5, "viidensistä")
-      , (6, "kuudensista")
-      , (7, "seitsemänsistä")
-      , (8, "kahdeksansista")
-      , (9, "yhdeksänsistä")
-      , (10, "kymmenensistä")
-      , (11, "yhdensistätoista")
-      , (12, "kahdensistatoista")
-      , (13, "kolmansistatoista")
-      , (14, "neljänsistätoista")
-      , (15, "viidensistätoista")
-      , (16, "kuudensistatoista")
-      , (17, "seitsemänsistätoista")
-      , (18, "kahdeksansistatoista")
-      , (19, "yhdeksänsistätoista")
-      , (20, "kahdensistakymmenensistä")
-      , (21, "kahdensistakymmenensistäensimmäisistä")
-      , (100, "sadansista")
-      , (1000, "tuhannensista")
-      ]
-    )
-  , ( "plural locative illative"
-    , plural $ locativeIllative defaultInflection
-    , [ (0, "nollansiin")
-      , (1, "ensimmäisiin")
-      , (2, "toisiin")
-      , (3, "kolmansiin")
-      , (4, "neljänsiin")
-      , (5, "viidensiin")
-      , (6, "kuudensiin")
-      , (7, "seitsemänsiin")
-      , (8, "kahdeksansiin")
-      , (9, "yhdeksänsiin")
-      , (10, "kymmenensiin")
-      , (11, "yhdensiintoista")
-      , (12, "kahdensiintoista")
-      , (13, "kolmansiintoista")
-      , (14, "neljänsiintoista")
-      , (15, "viidensiintoista")
-      , (16, "kuudensiintoista")
-      , (17, "seitsemänsiintoista")
-      , (18, "kahdeksansiintoista")
-      , (19, "yhdeksänsiintoista")
-      , (20, "kahdensiinkymmenensiin")
-      , (21, "kahdensiinkymmenensiinensimmäisiin")
-      , (100, "sadansiin")
-      , (1000, "tuhannensiin")
-      ]
-    )
-  , ( "plural locative adessive"
-    , plural $ locativeAdessive defaultInflection
-    , [ (0, "nollansilla")
-      , (1, "ensimmäisillä")
-      , (2, "toisilla")
-      , (3, "kolmansilla")
-      , (4, "neljänsillä")
-      , (5, "viidensillä")
-      , (6, "kuudensilla")
-      , (7, "seitsemänsillä")
-      , (8, "kahdeksansilla")
-      , (9, "yhdeksänsillä")
-      , (10, "kymmenensillä")
-      , (11, "yhdensillätoista")
-      , (12, "kahdensillatoista")
-      , (13, "kolmansillatoista")
-      , (14, "neljänsillätoista")
-      , (15, "viidensillätoista")
-      , (16, "kuudensillatoista")
-      , (17, "seitsemänsillätoista")
-      , (18, "kahdeksansillatoista")
-      , (19, "yhdeksänsillätoista")
-      , (20, "kahdensillakymmenensillä")
-      , (21, "kahdensillakymmenensilläensimmäisillä")
-      , (100, "sadansilla")
-      , (1000, "tuhannensilla")
-      ]
-    )
-  , ( "plural locative ablative"
-    , plural $ locativeAblative defaultInflection
-    , [ (0, "nollansilta")
-      , (1, "ensimmäisiltä")
-      , (2, "toisilta")
-      , (3, "kolmansilta")
-      , (4, "neljänsiltä")
-      , (5, "viidensiltä")
-      , (6, "kuudensilta")
-      , (7, "seitsemänsiltä")
-      , (8, "kahdeksansilta")
-      , (9, "yhdeksänsiltä")
-      , (10, "kymmenensiltä")
-      , (11, "yhdensitlätoista")
-      , (12, "kahdensiltatoista")
-      , (13, "kolmansiltatoista")
-      , (14, "neljänsiltätoista")
-      , (15, "viidensiltätoista")
-      , (16, "kuudensiltatoista")
-      , (17, "seitsemänsiltätoista")
-      , (18, "kahdeksansiltatoista")
-      , (19, "yhdeksänsiltätoista")
-      , (20, "kahdensiltakymmenensiltä")
-      , (21, "kahdensiltakymmenensiltäensimmäisiltä")
-      , (100, "sadansilta")
-      , (1000, "tuhannensilta")
-      ]
-    )
-  , ( "plural locative allative"
-    , plural $ locativeAllative defaultInflection
-    , [ (0, "nollansille")
-      , (1, "ensimmäisille")
-      , (2, "toisille")
-      , (3, "kolmansille")
-      , (4, "neljänsille")
-      , (5, "viidensille")
-      , (6, "kuudensille")
-      , (7, "seitsemänsille")
-      , (8, "kahdeksansille")
-      , (9, "yhdeksänsille")
-      , (10, "kymmenensille")
-      , (11, "yhdensiintoista")
-      , (12, "kahdensilletoista")
-      , (13, "kolmansilletoista")
-      , (14, "neljänsilletoista")
-      , (15, "viidensilletoista")
-      , (16, "kuudensilletoista")
-      , (17, "seitsemänsilletoista")
-      , (18, "kahdeksansilletoista")
-      , (19, "yhdeksänsilletoista")
-      , (20, "kahdensillekymmenensille")
-      , (21, "kahdensillekymmenensilleensimmäisille")
-      , (100, "sadansille")
-      , (1000, "tuhannensille")
-      ]
-    )
-  , ( "plural abessive"
-    , plural $ abessive defaultInflection
-    , [ (0, "nollansitta")
-      , (1, "ensimmäisittä")
-      , (2, "toisitta")
-      , (3, "kolmansitta")
-      , (4, "neljänsittä")
-      , (5, "viidensittä")
-      , (6, "kuudensitta")
-      , (7, "seitsemänsittä")
-      , (8, "kahdeksansitta")
-      , (9, "yhdeksänsittä")
-      , (10, "kymmenensittä")
-      , (11, "yhdensittätoista")
-      , (12, "kahdensittatoista")
-      , (13, "kolmansittatoista")
-      , (14, "neljänsittätoista")
-      , (15, "viidensittätoista")
-      , (16, "kuudensittatoista")
-      , (17, "seitsemänsittätoista")
-      , (18, "kahdeksansittatoista")
-      , (19, "yhdeksänsittätoista")
-      , (20, "kahdensittakymmenensittä")
-      , (21, "kahdensittakymmenensittäensimmäisittä")
-      , (100, "sadansitta")
-      , (1000, "tuhannensitta")
-      ]
-    )
-  , ( "plural comitative"
-    , plural $ comitative defaultInflection
-    , [ (0, "nollansine")
-      , (1, "ensimmäisine")
-      , (2, "toisine")
-      , (3, "kolmansine")
-      , (4, "neljänsine")
-      , (5, "viidensine")
-      , (6, "kuudensine")
-      , (7, "seitsemänsine")
-      , (8, "kahdeksansine")
-      , (9, "yhdeksänsine")
-      , (10, "kymmenensine")
-      , (11, "yhdensinetoista")
-      , (12, "kahdensinetoista")
-      , (13, "kolmansinetoista")
-      , (14, "neljänsinetoista")
-      , (15, "viidensinetoista")
-      , (16, "kuudensinetoista")
-      , (17, "seitsemänsinetoista")
-      , (18, "kahdeksansinetoista")
-      , (19, "yhdeksänsinetoista")
-      , (20, "kahdensinekymmenensine")
-      , (21, "kahdensinekymmenensineensimmäisine")
-      , (100, "sadansine")
-      , (1000, "tuhannensine")
-      ]
-    )
-  , ( "plural instructive"
-    , plural $ instructive defaultInflection
-    , [ (0, "nollansin")
-      , (1, "ensimmäisin")
-      , (2, "toisin")
-      , (3, "kolmansin")
-      , (4, "neljänsin")
-      , (5, "viidensin")
-      , (6, "kuudensin")
-      , (7, "seitsemänsin")
-      , (8, "kahdeksansin")
-      , (9, "yhdeksänsin")
-      , (10, "kymmenensin")
-      , (11, "yhdensintoista")
-      , (12, "kahdensintoista")
-      , (13, "kolmansintoista")
-      , (14, "neljänsintoista")
-      , (15, "viidensintoista")
-      , (16, "kuudensintoista")
-      , (17, "seitsemänsintoista")
-      , (18, "kahdeksansintoista")
-      , (19, "yhdeksänsintoista")
-      , (20, "kahdensinkymmenensin")
-      , (21, "kahdensinkymmenensinensimmäisin")
-      , (100, "sadansin")
-      , (1000, "tuhannensin")
-      ]
-    )
-  ]
-
-multiplicatives ∷ (Integral i) ⇒ TestData i
-multiplicatives =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "kerran")
-      , (2, "kahdesti")
-      , (6, "kuudesti")
-      ]
-    )
-  ]
-
-multipliers ∷ (Integral i) ⇒ TestData i
-multipliers =
-  [ ( "default"
-    , defaultInflection
-    , [ (6, "kuusinkertainen")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/FIN/TestData.hs b/src-test/Text/Numeral/Language/FIN/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/FIN/TestData.hs
@@ -0,0 +1,1820 @@
+{-|
+[@ISO639-1@]        fi
+
+[@ISO639-2@]        fin
+
+[@ISO639-3@]        fin
+
+[@Native name@]     suomi
+
+[@English name@]    Finnish
+-}
+
+module Text.Numeral.Language.FIN.TestData
+    ( cardinals
+    , ordinals
+    , multiplicatives
+    , multipliers
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( ($) )
+import "base" Prelude     ( Integral, (+) )
+import "numerals" Text.Numeral.Grammar
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+-- Sources:
+--   http://www.marijn.org/everything-is-4/counting-0-to-100/finnish
+--   http://www.languagesandnumbers.com/how-to-count-in-finnish/en/fin/
+--   http://en.wikipedia.org/wiki/Finnish_numerals
+--   http://mylanguages.org/finnish_numbers.php
+--   http://users.jyu.fi/~pamakine/kieli/suomi/numeraalit/numeroten.html
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "singular nominative"
+    , singular $ nominative defaultInflection
+    , [ (0, "nolla")
+      , (1, "yksi")
+      , (2, "kaksi")
+      , (3, "kolme")
+      , (4, "neljä")
+      , (5, "viisi")
+      , (6, "kuusi")
+      , (7, "seitsemän")
+      , (8, "kahdeksan")
+      , (9, "yhdeksän")
+      , (10, "kymmenen")
+      , (11, "yksitoista")
+      , (12, "kaksitoista")
+      , (13, "kolmetoista")
+      , (14, "neljätoista")
+      , (15, "viisitoista")
+      , (16, "kuusitoista")
+      , (17, "seitsemäntoista")
+      , (18, "kahdeksantoista")
+      , (19, "yhdeksäntoista")
+      , (20, "kaksikymmentä")
+      , (21, "kaksikymmentäyksi")
+      , (22, "kaksikymmentäkaksi")
+      , (23, "kaksikymmentäkolme")
+      , (24, "kaksikymmentäneljä")
+      , (25, "kaksikymmentäviisi")
+      , (26, "kaksikymmentäkuusi")
+      , (27, "kaksikymmentäseitsemän")
+      , (28, "kaksikymmentäkahdeksan")
+      , (29, "kaksikymmentäyhdeksän")
+      , (30, "kolmekymmentä")
+      , (31, "kolmekymmentäyksi")
+      , (32, "kolmekymmentäkaksi")
+      , (33, "kolmekymmentäkolme")
+      , (34, "kolmekymmentäneljä")
+      , (35, "kolmekymmentäviisi")
+      , (36, "kolmekymmentäkuusi")
+      , (37, "kolmekymmentäseitsemän")
+      , (38, "kolmekymmentäkahdeksan")
+      , (39, "kolmekymmentäyhdeksän")
+      , (40, "neljäkymmentä")
+      , (41, "neljäkymmentäyksi")
+      , (42, "neljäkymmentäkaksi")
+      , (43, "neljäkymmentäkolme")
+      , (44, "neljäkymmentäneljä")
+      , (45, "neljäkymmentäviisi")
+      , (46, "neljäkymmentäkuusi")
+      , (47, "neljäkymmentäseitsemän")
+      , (48, "neljäkymmentäkahdeksan")
+      , (49, "neljäkymmentäyhdeksän")
+      , (50, "viisikymmentä")
+      , (51, "viisikymmentäyksi")
+      , (52, "viisikymmentäkaksi")
+      , (53, "viisikymmentäkolme")
+      , (54, "viisikymmentäneljä")
+      , (55, "viisikymmentäviisi")
+      , (56, "viisikymmentäkuusi")
+      , (57, "viisikymmentäseitsemän")
+      , (58, "viisikymmentäkahdeksan")
+      , (59, "viisikymmentäyhdeksän")
+      , (60, "kuusikymmentä")
+      , (61, "kuusikymmentäyksi")
+      , (62, "kuusikymmentäkaksi")
+      , (63, "kuusikymmentäkolme")
+      , (64, "kuusikymmentäneljä")
+      , (65, "kuusikymmentäviisi")
+      , (66, "kuusikymmentäkuusi")
+      , (67, "kuusikymmentäseitsemän")
+      , (68, "kuusikymmentäkahdeksan")
+      , (69, "kuusikymmentäyhdeksän")
+      , (70, "seitsemänkymmentä")
+      , (71, "seitsemänkymmentäyksi")
+      , (72, "seitsemänkymmentäkaksi")
+      , (73, "seitsemänkymmentäkolme")
+      , (74, "seitsemänkymmentäneljä")
+      , (75, "seitsemänkymmentäviisi")
+      , (76, "seitsemänkymmentäkuusi")
+      , (77, "seitsemänkymmentäseitsemän")
+      , (78, "seitsemänkymmentäkahdeksan")
+      , (79, "seitsemänkymmentäyhdeksän")
+      , (80, "kahdeksankymmentä")
+      , (81, "kahdeksankymmentäyksi")
+      , (82, "kahdeksankymmentäkaksi")
+      , (83, "kahdeksankymmentäkolme")
+      , (84, "kahdeksankymmentäneljä")
+      , (85, "kahdeksankymmentäviisi")
+      , (86, "kahdeksankymmentäkuusi")
+      , (87, "kahdeksankymmentäseitsemän")
+      , (88, "kahdeksankymmentäkahdeksan")
+      , (89, "kahdeksankymmentäyhdeksän")
+      , (90, "yhdeksänkymmentä")
+      , (91, "yhdeksänkymmentäyksi")
+      , (92, "yhdeksänkymmentäkaksi")
+      , (93, "yhdeksänkymmentäkolme")
+      , (94, "yhdeksänkymmentäneljä")
+      , (95, "yhdeksänkymmentäviisi")
+      , (96, "yhdeksänkymmentäkuusi")
+      , (97, "yhdeksänkymmentäseitsemän")
+      , (98, "yhdeksänkymmentäkahdeksan")
+      , (99, "yhdeksänkymmentäyhdeksän")
+      , (100, "sata")
+      , (101, "satayksi")
+      , (123, "satakaksikymmentäkolme")
+      , (200, "kaksisataa")
+      , (300, "kolmesataa")
+      , (357, "kolmesataaviisikymmentäseitsemän")
+      , (400, "neljäsataa")
+      , (500, "viisisataa")
+      , (567, "viisisataakuusikymmentäseitsemän")
+      , (600, "kuusisataa")
+      , (700, "seitsemänsataa")
+      , (800, "kahdeksansataa")
+      , (900, "yhdeksänsataa")
+      , (999, "yhdeksänsataayhdeksänkymmentäyhdeksän")
+      , (1000, "tuhat")
+      , (1001, "tuhatyksi")
+      , (2000, "kaksituhatta")
+      , (3000, "kolmetuhatta")
+      , (3456, "kolmetuhattaneljäsataaviisikymmentäkuusi")
+      , (3721, "kolmetuhattaseitsemänsataakaksikymmentäyksi")
+      , (4000, "neljätuhatta")
+      , (5000, "viisituhatta")
+      , (6000, "kuusituhatta")
+      , (7000, "seitsemäntuhatta")
+      , (8000, "kahdeksantuhatta")
+      , (9000, "yhdeksäntuhatta")
+      , (10000, "kymmenentuhatta")
+      , (11000, "toistatuhatta")
+      , (12000, "toistakaksituhatta")
+      , (13000, "toistakolmetuhatta")
+      , (dec 5, "satatuhatta")
+      , (2 * dec 5, "kaksisataatuhatta")
+      , (dec 6, "miljoona")
+      , (dec 6 + 1, "miljoonayksi")
+      , (2 * dec 6, "kaksimiljoonaa")
+      , (32534756, "kolmekymmentäkaksimiljoonaaviisisataakolmekymmentäneljätuhattaseitsemänsataaviisikymmentäkuusi")
+      , (dec 9, "miljardi")
+      , (2 * dec 9, "kaksimiljardia")
+      , (3 * dec 9, "kolmemiljardia")
+      , (dec 12, "biljoona")
+      , (3 * dec 12, "kolmebiljoonaa")
+      ]
+    )
+  , ( "singular accusative"
+    , singular $ accusative defaultInflection
+    , [ (0, "nolla")
+      , (1, "yksi")
+      , (2, "kaksi")
+      , (3, "kolme")
+      , (4, "neljä")
+      , (5, "viisi")
+      , (6, "kuusi")
+      , (7, "seitsemän")
+      , (8, "kahdeksan")
+      , (9, "yhdeksän")
+      , (10, "kymmenen")
+      , (11, "yksitoista")
+      , (12, "kaksitoista")
+      , (13, "kolmetoista")
+      , (14, "neljätoista")
+      , (15, "viisitoista")
+      , (16, "kuusitoista")
+      , (17, "seitsemäntoista")
+      , (18, "kahdeksantoista")
+      , (19, "yhdeksäntoista")
+      , (20, "kaksikymmentä")
+      , (21, "kaksikymmentäyksi")
+      , (100, "sata")
+      , (1000, "tuhat")
+      ]
+    )
+  , ( "singular genitive"
+    , singular $ genitive defaultInflection
+    , [ (0, "nollan")
+      , (1, "yhden")
+      , (2, "kahden")
+      , (3, "kolmen")
+      , (4, "neljän")
+      , (5, "viiden")
+      , (6, "kuuden")
+      , (7, "seitsemän")
+      , (8, "kahdeksan")
+      , (9, "yhdeksän")
+      , (10, "kymmenen")
+      , (11, "yhdentoista")
+      , (12, "kahdentoista")
+      , (13, "kolmentoista")
+      , (14, "neljäntoista")
+      , (15, "viidentoista")
+      , (16, "kuudentoista")
+      , (17, "seitsemäntoista")
+      , (18, "kahdeksantoista")
+      , (19, "yhdeksäntoista")
+      , (20, "kahdenkymmenen")
+      , (21, "kahdenkymmenenyhden")
+      , (100, "sadan")
+      , (357, "kolmensadanviidenkymmenenseitsemän")
+      , (1000, "tuhannen")
+      ]
+    )
+  , ( "singular partitive"
+    , singular $ partitive defaultInflection
+    , [ (0, "nollaa")
+      , (1, "yhtä")
+      , (2, "kahta")
+      , (3, "kolmea")
+      , (4, "neljää")
+      , (5, "viittä")
+      , (6, "kuutta")
+      , (7, "seitsemää")
+      , (8, "kahdeksaa")
+      , (9, "yhdeksää")
+      , (10, "kymmentä")
+      , (11, "yhtätoista")
+      , (12, "kahtatoista")
+      , (13, "kolmeatoista")
+      , (14, "neljäätoista")
+      , (15, "viittätoista")
+      , (16, "kuuttatoista")
+      , (17, "seitsemäätoista")
+      , (18, "kahdeksaatoista")
+      , (19, "yhdeksäätoista")
+      , (20, "kahtakymmentä")
+      , (21, "kahtakymmentäyhtä")
+      , (100, "sataa")
+      , (357, "kolmeasataaviittäkymmentäseitsemää")
+      , (1000, "tuhatta")
+      ]
+    )
+  , ( "singular essive"
+    , singular $ essive defaultInflection
+    , [ (0, "nollana")
+      , (1, "yhtenä")
+      , (2, "kahtena")
+      , (3, "kolmena")
+      , (4, "neljänä")
+      , (5, "viitenä")
+      , (6, "kuutena")
+      , (7, "seitsemänä")
+      , (8, "kahdeksana")
+      , (9, "yhdeksänä")
+      , (10, "kymmenenä")
+      , (11, "yhtenätoista")
+      , (12, "kahtenatoista")
+      , (13, "kolmenatoista")
+      , (14, "neljänätoista")
+      , (15, "viitenätoista")
+      , (16, "kuutenatoista")
+      , (17, "seitsemänätoista")
+      , (18, "kahdeksanatoista")
+      , (19, "yhdeksänätoista")
+      , (20, "kahtenakymmenenä")
+      , (21, "kahdessakymmenessäyhdessä")
+      , (100, "satana")
+      , (357, "kolmenasatanaviitenäkymmenenäseitsemänä")
+      , (1000, "tuhantena")
+      ]
+    )
+  , ( "singular translative"
+    , singular $ translative defaultInflection
+    , [ (0, "nollaksi")
+      , (1, "yhdeksi")
+      , (2, "kahdeksi")
+      , (3, "kolmeksi")
+      , (4, "neljäksi")
+      , (5, "viideksi")
+      , (6, "kuudeksi")
+      , (7, "seitsemäksi")
+      , (8, "kahdeksaksi")
+      , (9, "yhdeksäksi")
+      , (10, "kymmeneksi")
+      , (11, "yhdeksitoista")
+      , (12, "kahdeksitoista")
+      , (13, "kolmeksitoista")
+      , (14, "neljäksitoista")
+      , (15, "viideksitoista")
+      , (16, "kuudeksitoista")
+      , (17, "seitsemäksitoista")
+      , (18, "kahdeksaksitoista")
+      , (19, "yhdeksäksitoista")
+      , (20, "kahdeksikymmeneksi")
+      , (21, "kahdeksikymmeneksiyhdeksi")
+      , (100, "sadaksi")
+      , (1000, "tuhanneksi")
+      ]
+    )
+  , ( "singular locative inessive"
+    , singular $ locativeInessive defaultInflection
+    , [ (0, "nollassa")
+      , (1, "yhdessä")
+      , (2, "kahdessa")
+      , (3, "kolmessa")
+      , (4, "neljässä")
+      , (5, "viidessä")
+      , (6, "kuudessa")
+      , (7, "seitsemässä")
+      , (8, "kahdeksassa")
+      , (9, "yhdeksässä")
+      , (10, "kymmenessä")
+      , (11, "yhdessätoista")
+      , (12, "kahdessatoista")
+      , (13, "kolmessatoista")
+      , (14, "neljässätoista")
+      , (15, "viidessätoista")
+      , (16, "kuudessatoista")
+      , (17, "seitsemässätoista")
+      , (18, "kahdeksassatoista")
+      , (19, "yhdeksässätoista")
+      , (20, "kahdessakymmenessä")
+      , (21, "kahdessakymmenessäyhdessä")
+      , (100, "sadassa")
+      , (1000, "tuhannessa")
+      ]
+    )
+  , ( "singular locative elative"
+    , singular $ locativeElative defaultInflection
+    , [ (0, "nollasta")
+      , (1, "yhdestä")
+      , (2, "kahdesta")
+      , (3, "kolmesta")
+      , (4, "neljästä")
+      , (5, "viidestä")
+      , (6, "kuudesta")
+      , (7, "seitsemästä")
+      , (8, "kahdeksasta")
+      , (9, "yhdeksästä")
+      , (10, "kymmenestä")
+      , (11, "yhdestätoista")
+      , (12, "kahdestatoista")
+      , (13, "kolmestatoista")
+      , (14, "neljästätoista")
+      , (15, "viidestätoista")
+      , (16, "kuudestatoista")
+      , (17, "seitsemästätoista")
+      , (18, "kahdeksastatoista")
+      , (19, "yhdeksästätoista")
+      , (20, "kahdestakymmenestä")
+      , (21, "kahdestakymmenestäyhdestä")
+      , (100, "sadasta")
+      , (1000, "tuhannesta")
+      ]
+    )
+  , ( "singular locative illative"
+    ,  singular $ locativeIllative defaultInflection
+    , [ (0, "nollaan")
+      , (1, "yhteen")
+      , (2, "kahteen")
+      , (3, "kolmeen")
+      , (4, "neljään")
+      , (5, "viiteen")
+      , (6, "kuuteen")
+      , (7, "seitsemään")
+      , (8, "kahdeksaan")
+      , (9, "yhdeksään")
+      , (10, "kymmeneen")
+      , (11, "yhteentoista")
+      , (12, "kahteentoista")
+      , (13, "kolmeentoista")
+      , (14, "neljääntoista")
+      , (15, "viiteentoista")
+      , (16, "kuuteentoista")
+      , (17, "seitsemääntoista")
+      , (18, "kahdeksaantoista")
+      , (19, "yhdeksääntoista")
+      , (20, "kahteenkymmeneen")
+      , (21, "kahteenkymmeneenyhteen")
+      , (100, "sataan")
+      , (1000, "tuhanteen")
+      ]
+    )
+  , ( "singular locative adessive"
+    , singular $ locativeAdessive defaultInflection
+    , [ (0, "nollalla")
+      , (1, "yhdellä")
+      , (2, "kahdella")
+      , (3, "kolmella")
+      , (4, "neljällä")
+      , (5, "viidellä")
+      , (6, "kuudella")
+      , (7, "seitsemällä")
+      , (8, "kahdeksalla")
+      , (9, "yhdeksällä")
+      , (10, "kymmenellä")
+      , (11, "yhdellätoista")
+      , (12, "kahdellatoista")
+      , (13, "kolmellatoista")
+      , (14, "neljällätoista")
+      , (15, "viidellätoista")
+      , (16, "kuudellatoista")
+      , (17, "seitsemällätoista")
+      , (18, "kahdeksallatoista")
+      , (19, "yhdeksällätoista")
+      , (20, "kahdellakymmenellä")
+      , (21, "kahdellakymmenelläyhdellä")
+      , (100, "sadalla")
+      , (1000, "tuhannella")
+      ]
+    )
+  , ( "singular locative ablative"
+    , singular $ locativeAblative defaultInflection
+    , [ (0, "nollalta")
+      , (1, "yhdeltä")
+      , (2, "kahdelta")
+      , (3, "kolmelta")
+      , (4, "neljältä")
+      , (5, "viideltä")
+      , (6, "kuudelta")
+      , (7, "seitsemältä")
+      , (8, "kahdeksalta")
+      , (9, "yhdeksältä")
+      , (10, "kymmeneltä")
+      , (11, "yhdeltätoista")
+      , (12, "kahdeltatoista")
+      , (13, "kolmeltatoista")
+      , (14, "neljältätoista")
+      , (15, "viideltätoista")
+      , (16, "kuudeltatoista")
+      , (17, "seitsemältätoista")
+      , (18, "kahdeksaltatoista")
+      , (19, "yhdeksältätoista")
+      , (20, "kahdeltakymmeneltä")
+      , (21, "kahdeltakymmeneltäyhdeltä")
+      , (100, "sadalta")
+      , (1000, "tuhannelta")
+      ]
+    )
+  , ( "singular locative allative"
+    , singular $ locativeAllative defaultInflection
+    , [ (0, "nollalle")
+      , (1, "yhdelle")
+      , (2, "kahdelle")
+      , (3, "kolmelle")
+      , (4, "neljälle")
+      , (5, "viidelle")
+      , (6, "kuudelle")
+      , (7, "seitsemälle")
+      , (8, "kahdeksalle")
+      , (9, "yhdeksälle")
+      , (10, "kymmenelle")
+      , (11, "yhdelletoista")
+      , (12, "kahdelletoista")
+      , (13, "kolmelletoista")
+      , (14, "neljälletoista")
+      , (15, "viidelletoista")
+      , (16, "kuudelletoista")
+      , (17, "seitsemälletoista")
+      , (18, "kahdeksalletoista")
+      , (19, "yhdeksälletoista")
+      , (20, "kahdellekymmenelle")
+      , (21, "kahdellekymmenelleyhdelle")
+      , (100, "sadalle")
+      , (1000, "tuhannelle")
+      ]
+    )
+  , ( "singular abessive"
+    , singular $ abessive defaultInflection
+    , [ (0, "nollatta")
+      , (1, "yhdettä")
+      , (2, "kahdetta")
+      , (3, "kolmetta")
+      , (4, "neljättä")
+      , (5, "viidettä")
+      , (6, "kuudetta")
+      , (7, "seitsemättä")
+      , (8, "kahdeksatta")
+      , (9, "yhdeksättä")
+      , (10, "kymmenettä")
+      , (11, "yhdettätoista")
+      , (12, "kahdettatoista")
+      , (13, "kolmettatoista")
+      , (14, "neljättätoista")
+      , (15, "viidettätoista")
+      , (16, "kuudettatoista")
+      , (17, "seitsemättätoista")
+      , (18, "kahdeksattatoista")
+      , (19, "yhdeksättätoista")
+      , (20, "kahdettakymmenettä")
+      , (21, "kahdettakymmenettäyhdettä")
+      , (100, "sadatta")
+      , (1000, "tuhannetta")
+      ]
+    )
+  , ( "singular super essive"
+    , singular $ superEssive defaultInflection
+    , [ (1, "yhtäällä")
+      , (2, "kahtaalla")
+      ]
+    )
+  , ( "singular delative"
+    , singular $ delative defaultInflection
+    , [ (1, "yhtäältä")
+      , (2, "kahtaalta")
+      ]
+    )
+  , ( "singular sublative"
+    , singular $ sublative defaultInflection
+    , [ (1, "yhtäälle")
+      , (2, "kahtaalle")
+      ]
+    )
+  , ( "singular lative"
+    , singular $ lative defaultInflection
+    , [ (1, "yhä")
+      , (2, "kahtia")
+      , (3, "kolmia")
+      ]
+    )
+  , ( "singular multiplicative"
+    , singular $ multiplicative defaultInflection
+    , [ (1, "yhdesti")
+      , (2, "kahdesti")
+      , (3, "kolmesti")
+      ]
+    )
+  , ( "plural nominative"
+    , plural $ nominative defaultInflection
+    , [ (0, "nollat")
+      , (1, "yhdet")
+      , (2, "kahdet")
+      , (3, "kolmet")
+      , (4, "neljät")
+      , (5, "viidet")
+      , (6, "kuudet")
+      , (7, "seitsemät")
+      , (8, "kahdeksat")
+      , (9, "yhdeksät")
+      , (10, "kymmenet")
+      , (11, "yhdettoista")
+      , (12, "kahdettoista")
+      , (13, "kolmettoista")
+      , (14, "neljättoista")
+      , (15, "viidettoista")
+      , (16, "kuudettoista")
+      , (17, "seitsemättoista")
+      , (18, "kahdeksattoista")
+      , (19, "yhdeksättoista")
+      , (20, "kahdetkymmenet")
+      , (21, "kahdetkymmenetyhdet")
+      , (100, "sadat")
+      , (1000, "tuhannet")
+      ]
+    )
+  , ( "plural accusative"
+    , plural $ accusative defaultInflection
+    , [ (0, "nollat")
+      , (1, "yhdet")
+      , (2, "kahdet")
+      , (3, "kolmet")
+      , (4, "neljät")
+      , (5, "viidet")
+      , (6, "kuudet")
+      , (7, "seitsemät")
+      , (8, "kahdeksat")
+      , (9, "yhdeksät")
+      , (10, "kymmenet")
+      , (11, "yhdettoista")
+      , (12, "kahdettoista")
+      , (13, "kolmettoista")
+      , (14, "neljättoista")
+      , (15, "viidettoista")
+      , (16, "kuudettoista")
+      , (17, "seitsemättoista")
+      , (18, "kahdeksattoista")
+      , (19, "yhdeksättoista")
+      , (20, "kahdetkymmenet")
+      , (21, "kahdetkymmenetyhdet")
+      , (100, "sadat")
+      , (1000, "tuhannet")
+      ]
+    )
+  , ( "plural genitive"
+    , plural $ genitive defaultInflection
+    , [ (0, "nollien")
+      , (1, "yksien")
+      , (2, "kaksien")
+      , (3, "kolmien")
+      , (4, "neljien")
+      , (5, "viisien")
+      , (6, "kuusien")
+      , (7, "seitsemien")
+      , (8, "kahdeksien")
+      , (9, "yhdeksien")
+      , (10, "kymmenien")
+      , (11, "yksientoista")
+      , (12, "kaksientoista")
+      , (13, "kolmientoista")
+      , (14, "neljientoista")
+      , (15, "viisientoista")
+      , (16, "kuusientoista")
+      , (17, "seitsemientoista")
+      , (18, "kahdeksientoista")
+      , (19, "yhdeksientoista")
+      , (20, "kaksienkymmenien")
+      , (21, "kaksienkymmenienyksien")
+      , (100, "satojen")
+      , (1000, "tuhansien")
+      ]
+    )
+  , ( "plural partitive"
+    , plural $ partitive defaultInflection
+    , [ (0, "nollia")
+      , (1, "yksiä")
+      , (2, "kaksia")
+      , (3, "kolmia")
+      , (4, "neljiä")
+      , (5, "viisiä")
+      , (6, "kuusia")
+      , (7, "seitsemiä")
+      , (8, "kahdeksia")
+      , (9, "yhdeksiä")
+      , (10, "kymmeniä")
+      , (11, "yksiätoista")
+      , (12, "kaksiatoista")
+      , (13, "kolmiatoista")
+      , (14, "neljiätoista")
+      , (15, "viittätoista")
+      , (16, "kuuttatoista")
+      , (17, "seitsemiätoista")
+      , (18, "kahdeksiatoista")
+      , (19, "yhdeksiätoista")
+      , (20, "kaksiakymmeniä")
+      , (21, "kaksiakymmeniäyksiä")
+      , (100, "satoja")
+      , (1000, "tuhansia")
+      ]
+    )
+  , ( "plural essive"
+    , plural $ essive defaultInflection
+    , [ (0, "nollina")
+      , (1, "yksinä")
+      , (2, "kaksina")
+      , (3, "kolmina")
+      , (4, "neljinä")
+      , (5, "viisinä")
+      , (6, "kuusina")
+      , (7, "seitseminä")
+      , (8, "kahdeksina")
+      , (9, "yhdeksinä")
+      , (10, "kymmeninä")
+      , (11, "yksinätoista")
+      , (12, "kaksinatoista")
+      , (13, "kolminatoista")
+      , (14, "neljinätoista")
+      , (15, "viitenätoista")
+      , (16, "kuutenatoista")
+      , (17, "seitseminätoista")
+      , (18, "kahdeksinatoista")
+      , (19, "yhdeksinätoista")
+      , (20, "kaksinakymmeninä")
+      , (21, "kaksinakymmeninäyksinä")
+      , (100, "satoina")
+      , (1000, "tuhansina")
+      ]
+    )
+  , ( "plural translative"
+    , plural $ translative defaultInflection
+    , [ (0, "nolliksi")
+      , (1, "yksiksi")
+      , (2, "kaksiksi")
+      , (3, "kolmiksi")
+      , (4, "neljiksi")
+      , (5, "viisiksi")
+      , (6, "kuusiksi")
+      , (7, "seitsemiksi")
+      , (8, "kahdeksiksi")
+      , (9, "yhdeksiksi")
+      , (10, "kymmeniksi")
+      , (11, "yksiksitoista")
+      , (12, "kaksiksitoista")
+      , (13, "kolmiksitoista")
+      , (14, "neljiksitoista")
+      , (15, "viideksitoista")
+      , (16, "kuudeksitoista")
+      , (17, "seitsemiksitoista")
+      , (18, "kahdeksiksitoista")
+      , (19, "yhdeksiksitoista")
+      , (20, "kaksiksikymmeniksi")
+      , (21, "kaksiksikymmeniksiyksiksi")
+      , (100, "sadoiksi")
+      , (1000, "tuhansiksi")
+      ]
+    )
+  , ( "plural locative inessive"
+    , plural $ locativeInessive defaultInflection
+    , [ (0, "nollissa")
+      , (1, "yksissä")
+      , (2, "kaksissa")
+      , (3, "kolmissa")
+      , (4, "neljissä")
+      , (5, "viisissä")
+      , (6, "kuusissa")
+      , (7, "seitsemissä")
+      , (8, "kahdeksissa")
+      , (9, "yhdeksissä")
+      , (10, "kymmenissä")
+      , (11, "yksissätoista")
+      , (12, "kaksissatoista")
+      , (13, "kolmissatoista")
+      , (14, "neljissätoista")
+      , (15, "viidessätoista")
+      , (16, "kuudessatoista")
+      , (17, "seitsemissätoista")
+      , (18, "kahdeksissatoista")
+      , (19, "yhdeksissätoista")
+      , (20, "kaksissakymmenissä")
+      , (21, "kaksissakymmenissäyksissä")
+      , (100, "sadoissa")
+      , (1000, "tuhansissa")
+      ]
+    )
+  , ( "plural locative elative"
+    , plural $ locativeElative defaultInflection
+    , [ (0, "nollista")
+      , (1, "yksistä")
+      , (2, "kaksista")
+      , (3, "kolmista")
+      , (4, "neljistä")
+      , (5, "viisistä")
+      , (6, "kuusista")
+      , (7, "seitsemistä")
+      , (8, "kahdeksista")
+      , (9, "yhdeksistä")
+      , (10, "kymmenistä")
+      , (11, "yksistätoista")
+      , (12, "kaksistatoista")
+      , (13, "kolmistatoista")
+      , (14, "neljistätoista")
+      , (15, "viidestätoista")
+      , (16, "kuudestatoista")
+      , (17, "seitsemistätoista")
+      , (18, "kahdeksistatoista")
+      , (19, "yhdeksistätoista")
+      , (20, "kaksistakymmenistä")
+      , (21, "kaksistakymmenistäyksistä")
+      , (100, "sadoista")
+      , (1000, "tuhansista")
+      ]
+    )
+  , ( "plural locative illative"
+    , plural $ locativeIllative defaultInflection
+    , [ (0, "nolliin")
+      , (1, "yksiin")
+      , (2, "kaksiin")
+      , (3, "kolmiin")
+      , (4, "neljiin")
+      , (5, "viisiin")
+      , (6, "kuusiin")
+      , (7, "seitsemiin")
+      , (8, "kahdeksiin")
+      , (9, "yhdeksiin")
+      , (10, "kymmeniin")
+      , (11, "yksiintoista")
+      , (12, "kaksiintoista")
+      , (13, "kolmiintoista")
+      , (14, "neljiintoista")
+      , (15, "viiteentoista")
+      , (16, "kuuteentoista")
+      , (17, "seitsemiintoista")
+      , (18, "kahdeksiintoista")
+      , (19, "yhdeksiintoista")
+      , (20, "kaksiinkymmeniin")
+      , (21, "kaksiinkymmeniinyksiin")
+      , (100, "satoihin")
+      , (1000, "tuhansiin")
+      ]
+    )
+  , ( "plural locative adessive"
+    , plural $ locativeAdessive defaultInflection
+    , [ (0, "nollilla")
+      , (1, "yksillä")
+      , (2, "kaksilla")
+      , (3, "kolmilla")
+      , (4, "neljillä")
+      , (5, "viisillä")
+      , (6, "kuusilla")
+      , (7, "seitsemillä")
+      , (8, "kahdeksilla")
+      , (9, "yhdeksillä")
+      , (10, "kymmenillä")
+      , (11, "yksillätoista")
+      , (12, "kaksillatoista")
+      , (13, "kolmillatoista")
+      , (14, "neljillätoista")
+      , (15, "viidellätoista")
+      , (16, "kuudellatoista")
+      , (17, "seitsemillätoista")
+      , (18, "kahdeksillatoista")
+      , (19, "yhdeksillätoista")
+      , (20, "kaksillakymmenillä")
+      , (21, "kaksillakymmenilläyksillä")
+      , (100, "sadoilla")
+      , (1000, "tuhansilla")
+      ]
+    )
+  , ( "plural locative ablative"
+    , plural $ locativeAblative defaultInflection
+    , [ (0, "nollilta")
+      , (1, "yksiltä")
+      , (2, "kaksilta")
+      , (3, "kolmilta")
+      , (4, "neljiltä")
+      , (5, "viisiltä")
+      , (6, "kuusilta")
+      , (7, "seitsemiltä")
+      , (8, "kahdeksilta")
+      , (9, "yhdeksiltä")
+      , (10, "kymmeniltä")
+      , (11, "yksiltätoista")
+      , (12, "kaksiltatoista")
+      , (13, "kolmiltatoista")
+      , (14, "neljiltätoista")
+      , (15, "viideltätoista")
+      , (16, "kuudeltatoista")
+      , (17, "seitsemiltätoista")
+      , (18, "kahdeksiltatoista")
+      , (19, "yhdeksiltätoista")
+      , (20, "kaksiltakymmeniltä")
+      , (21, "kaksiltakymeniltäyksiltä")
+      , (100, "sadoilta")
+      , (1000, "tuhansilta")
+      ]
+    )
+  , ( "plural locative allative"
+    , plural $ locativeAllative defaultInflection
+    , [ (0, "nollille")
+      , (1, "yksille")
+      , (2, "kaksille")
+      , (3, "kolmille")
+      , (4, "neljille")
+      , (5, "viisille")
+      , (6, "kuusille")
+      , (7, "seitsemille")
+      , (8, "kahdeksille")
+      , (9, "yhdeksille")
+      , (10, "kymmenille")
+      , (11, "yksilletoista")
+      , (12, "kaksilletoista")
+      , (13, "kolmilletoista")
+      , (14, "neljilletoista")
+      , (15, "viidelletoista")
+      , (16, "kuudelletoista")
+      , (17, "seitsemilletoista")
+      , (18, "kahdeksilletoista")
+      , (19, "yhdeksilletoista")
+      , (20, "kaksillekymmenille")
+      , (21, "kaksillekymmenilleyksille")
+      , (100, "sadoille")
+      , (1000, "tuhansille")
+      ]
+    )
+  , ( "plural abessive"
+    , plural $ abessive defaultInflection
+    , [ (0, "nollitta")
+      , (1, "yksittä")
+      , (2, "kaksitta")
+      , (3, "kolmitta")
+      , (4, "neljittä")
+      , (5, "viisittä")
+      , (6, "kuusitta")
+      , (7, "seitsemittä")
+      , (8, "kahdeksitta")
+      , (9, "yhdeksittä")
+      , (10, "kymmenittä")
+      , (11, "yksittätoista")
+      , (12, "kaksittatoista")
+      , (13, "kolmittatoista")
+      , (14, "neljittätoista")
+      , (15, "viidettätoista")
+      , (16, "kuudettatoista")
+      , (17, "seitsemittätoista")
+      , (18, "kahdeksittatoista")
+      , (19, "yhdeksittätoista")
+      , (20, "kaksittakymmenittä")
+      , (21, "kaksittakymmenittäyksittä")
+      , (100, "sadoitta")
+      , (1000, "tuhansitta")
+      ]
+    )
+  , ( "plural comitative"
+    , plural $ comitative defaultInflection
+    , [ (0, "nolline")
+      , (1, "yksine")
+      , (2, "kaksine")
+      , (3, "kolmine")
+      , (4, "neljine")
+      , (5, "viisine")
+      , (6, "kuusine")
+      , (7, "seitsemine")
+      , (8, "kahdeksine")
+      , (9, "yhdeksine")
+      , (10, "kymmenine")
+      , (11, "yksinetoista")
+      , (12, "kaksinetoista")
+      , (13, "kolminetoista")
+      , (14, "neljinetoista")
+      , (15, "viisinetoista")
+      , (16, "kuusinetoista")
+      , (17, "seitseminetoista")
+      , (18, "kahdeksinetoista")
+      , (19, "yhdeksinetoista")
+      , (20, "kaksinekymmenine")
+      , (21, "kaksinekymmenineyksine")
+      , (100, "satoine")
+      , (1000, "tuhansine")
+      ]
+    )
+  , ( "plural instructive"
+    , plural $ instructive defaultInflection
+    , [ (0, "nollin")
+      , (1, "yksin")
+      , (2, "kaksin")
+      , (3, "kolmin")
+      , (4, "neljin")
+      , (5, "viisin")
+      , (6, "kuusin")
+      , (7, "seitsemin")
+      , (8, "kahdeksin")
+      , (9, "yhdeksin")
+      , (10, "kymmenin")
+      , (11, "yksintoista")
+      , (12, "kaksintoista")
+      , (13, "kolmintoista")
+      , (14, "neljintoista")
+      , (15, "viisintoista")
+      , (16, "kuusintoista")
+      , (17, "seitsemintoista")
+      , (18, "kahdeksintoista")
+      , (19, "yhdeksintoista")
+      , (20, "kaksinkymmenin")
+      , (21, "kaksinkymmeninyksin")
+      , (100, "sadoin")
+      , (1000, "tuhansin")
+      ]
+    )
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals =
+  [ ( "singular nominative"
+    , singular $ nominative defaultInflection
+    , [ (0, "nollas")
+      , (1, "ensimmäinen")
+      , (2, "toinen")
+      , (3, "kolmas")
+      , (4, "neljäs")
+      , (5, "viides")
+      , (6, "kuudes")
+      , (7, "seitsemäs")
+      , (8, "kahdeksas")
+      , (9, "yhdeksäs")
+      , (10, "kymmenes")
+      , (11, "yhdestoista")
+      , (12, "kahdestoista")
+      , (13, "kolmastoista")
+      , (14, "neljästoista")
+      , (15, "viidestoista")
+      , (16, "kuudestoista")
+      , (17, "seitsemästoista")
+      , (18, "kahdeksastoista")
+      , (19, "yhdeksästoista")
+      , (20, "kahdeskymmenes")
+      , (21, "kahdeskymmenesensimmäinen") -- also kahdeskymmenesyhdes
+      , (22, "kahdeskymmenestoinen") -- also kahdeskymmeneskahdes
+      , (23, "kahdeskymmeneskolmas")
+      , (24, "kahdeskymmenesneljäs")
+      , (25, "kahdeskymmenesviides")
+      , (26, "kahdeskymmeneskuudes")
+      , (27, "kahdeskymmenesseitsemäs")
+      , (28, "kahdeskymmeneskahdeksas")
+      , (29, "kahdeskymmenesyhdeksäs")
+      , (30, "kolmaskymmenes")
+      , (40, "neljäskymmenes")
+      , (50, "viideskymmenes")
+      , (60, "kuudeskymmenes")
+      , (70, "seitsemäskymmenes")
+      , (80, "kahdeksaskymmenes")
+      , (90, "yhdeksäskymmenes")
+      , (100, "sadas")
+      , (101, "sadasensimmäinen")
+      , (357, "kolmassadasviideskymmenesseitsemäs")
+      , (1000, "tuhannes")
+      , (1001, "tuhannesensimmäinen")
+      , (3721, "kolmastuhannesseitsemässadaskahdeskymmenesensimmäinen")
+      ]
+    )
+  , ( "singular accusative"
+    , singular $ accusative defaultInflection
+    , [ (0, "nollas")
+      , (1, "ensimmäinen")
+      , (2, "toinen")
+      , (3, "kolmas")
+      , (4, "neljäs")
+      , (5, "viides")
+      , (6, "kuudes")
+      , (7, "seitsemäs")
+      , (8, "kahdeksas")
+      , (9, "yhdeksäs")
+      , (10, "kymmenes")
+      , (11, "yhdestoista")
+      , (12, "kahdestoista")
+      , (13, "kolmastoista")
+      , (14, "neljästoista")
+      , (15, "viidestoista")
+      , (16, "kuudestoista")
+      , (17, "seitsemästoista")
+      , (18, "kahdeksastoista")
+      , (19, "yhdeksästoista")
+      , (20, "kahdeskymmenes")
+      , (21, "kahdeskymmenesensimmäinen")
+      , (100, "sadas")
+      , (1000, "tuhannes")
+      ]
+    )
+  , ( "singular genitive"
+    , singular $ genitive defaultInflection
+    , [ (0, "nollannen")
+      , (1, "ensimmäisen")
+      , (2, "toisen")
+      , (3, "kolmannen")
+      , (4, "neljännen")
+      , (5, "viidennen")
+      , (6, "kuudennen")
+      , (7, "seitsemännen")
+      , (8, "kahdeksannen")
+      , (9, "yhdeksännen")
+      , (10, "kymmenennen")
+      , (11, "yhdennentoista")
+      , (12, "kahdennentoista")
+      , (13, "kolmannentoista")
+      , (14, "neljännentoista")
+      , (15, "viidennentoista")
+      , (16, "kuudennentoista")
+      , (17, "seitsemännentoista")
+      , (18, "kahdeksannentoista")
+      , (19, "yhdeksännentoista")
+      , (20, "kahdennenkymmenennen")
+      , (21, "kahdennenkymmenennenensimmäisen")
+      , (100, "sadannen")
+      , (357, "kolmannensadannenviidennenkymmenennenseitsemännen")
+      , (1000, "tuhannennen")
+      ]
+    )
+  , ( "singular partitive"
+    , singular $ partitive defaultInflection
+    , [ (0, "nollatta")
+      , (1, "ensimmäistä")
+      , (2, "toista")
+      , (3, "kolmatta")
+      , (4, "neljättä")
+      , (5, "viidettä")
+      , (6, "kuudetta")
+      , (7, "seitsemättä")
+      , (8, "kahdeksatta")
+      , (9, "yhdeksättä")
+      , (10, "kymmenettä")
+      , (11, "yhdettätoista")
+      , (12, "kahdettatoista")
+      , (13, "kolmattatoista")
+      , (14, "neljättätoista")
+      , (15, "viidettätoista")
+      , (16, "kuudettatoista")
+      , (17, "seitsemättätoista")
+      , (18, "kahdeksattatoista")
+      , (19, "yhdeksättätoista")
+      , (20, "kahdettakymmenettä")
+      , (21, "kahdettakymmenettäensimmäistä")
+      , (100, "sadatta")
+      , (357, "kolmattasadattaviidettäkymmenettäseitsemätta")
+      , (1000, "tuhannetta")
+      ]
+    )
+  , ( "singular essive"
+    , singular $ essive defaultInflection
+    , [ (0, "nollantena")
+      , (1, "ensimmmäisenä")
+      , (2, "toisena")
+      , (3, "kolmantena")
+      , (4, "neljäntenä")
+      , (5, "viidentenä")
+      , (6, "kuudentena")
+      , (7, "seitsemäntenä")
+      , (8, "kahdeksantena")
+      , (9, "yhdeksäntenä")
+      , (10, "kymmenentenä")
+      , (11, "yhdennessätoista")
+      , (12, "kahdentenatoista")
+      , (13, "kolmantenatoista")
+      , (14, "neljäntenätoista")
+      , (15, "viidentenätoista")
+      , (16, "kuudentenatoista")
+      , (17, "seitsemäntenätoista")
+      , (18, "kahdeksantenatoista")
+      , (19, "yhdeksäntenätoista")
+      , (20, "kahdentenakymmenentenä")
+      , (21, "kahdentenakymmenentenäensimmäisenä")
+      , (100, "sadantena")
+      , (357, "kolmantenasadantenaviidentenäkymmenentenäseitsemäntenä")
+      , (1000, "tuhannentena")
+      ]
+    )
+  , ( "singular translative"
+    , singular $ translative defaultInflection
+    , [ (0, "nollanneksi")
+      , (1, "ensimmäiseksi")
+      , (2, "toiseksi")
+      , (3, "kolmanneksi")
+      , (4, "neljänneksi")
+      , (5, "viidenneksi")
+      , (6, "kuudenneksi")
+      , (7, "seitsemänneksi")
+      , (8, "kahdeksanneksi")
+      , (9, "yhdeksänneksi")
+      , (10, "kymmenenneksi")
+      , (11, "yhdenneksitoista")
+      , (12, "kahdenneksitoista")
+      , (13, "kolmanneksitoista")
+      , (14, "neljänneksitoista")
+      , (15, "viidenneksitoista")
+      , (16, "kuudenneksitoista")
+      , (17, "seitsemänneksitoista")
+      , (18, "kahdenksanneksitoista")
+      , (19, "yhdeksänneksitoista")
+      , (20, "kahdenneksikymmenenneksi")
+      , (21, "kahdenneksikymmenenneksiensimmäiseksi")
+      , (100, "sadanneksi")
+      , (1000, "tuhannenneksi")
+      ]
+    )
+  , ( "singular locative inessive"
+    , singular $ locativeInessive defaultInflection
+    , [ (0, "nollannessa")
+      , (1, "ensimmäisessä")
+      , (2, "toisessa")
+      , (3, "kolmannessa")
+      , (4, "neljännessä")
+      , (5, "viidennessä")
+      , (6, "kuudennessa")
+      , (7, "seitsemännessä")
+      , (8, "kahdeksannessa")
+      , (9, "yhdeksännessä")
+      , (10, "kymmenennessä")
+      , (11, "yhdennessätoista")
+      , (12, "kahdennessatoista")
+      , (13, "kolmannessatoista")
+      , (14, "neljännessätoista")
+      , (15, "viidennessätoista")
+      , (16, "kuudennessatoista")
+      , (17, "seitsemännessätoista")
+      , (18, "kahdeksannessatoista")
+      , (19, "yhdeksännessätoista")
+      , (20, "kahdennessakymmenennessä")
+      , (21, "kahdennessakymmenennessäensimmäisessä")
+      , (100, "sadannessa")
+      , (1000, "tuhannennessa")
+      ]
+    )
+  , ( "singular locative elative"
+    , singular $ locativeElative defaultInflection
+    , [ (0, "nollannesta")
+      , (1, "ensimmäisestä")
+      , (2, "toisesta")
+      , (3, "kolmannesta")
+      , (4, "neljännestä")
+      , (5, "viidennestä")
+      , (6, "kuudennesta")
+      , (7, "seitsemännestä")
+      , (8, "kahdeksannesta")
+      , (9, "yhdeksännestä")
+      , (10, "kymmenennestä")
+      , (11, "yhdennestätoista")
+      , (12, "kahdennestatoista")
+      , (13, "kolmannestatoista")
+      , (14, "neljännestätoista")
+      , (15, "viidennestätoista")
+      , (16, "kuudennestatoista")
+      , (17, "seitsemännestätoista")
+      , (18, "kahdeksannestatoista")
+      , (19, "yhdeksännestätoista")
+      , (20, "kahdennestakymmenennestä")
+      , (21, "kahdennestakymmenennestäensimmäisestä")
+      , (100, "sadannesta")
+      , (1000, "tuhannennesta")
+      ]
+    )
+  , ( "singular locative illative"
+    , singular $ locativeIllative defaultInflection
+    , [ (0, "nollanteen")
+      , (1, "ensimmäiseen")
+      , (2, "toiseen")
+      , (3, "kolmanteen")
+      , (4, "neljänteen")
+      , (5, "viidenteen")
+      , (6, "kuudenteen")
+      , (7, "seitsemänteen")
+      , (8, "kahdeksanteen")
+      , (9, "yhdeksänteen")
+      , (10, "kymmenenteen")
+      , (11, "yhdenteentoista")
+      , (12, "kahdenteentoista")
+      , (13, "kolmanteentoista")
+      , (14, "neljänteentoista")
+      , (15, "viidenteentoista")
+      , (16, "kuudenteentoista")
+      , (17, "seitsemänteentoista")
+      , (18, "kahdeksanteentoista")
+      , (19, "yhdeksänteentoista")
+      , (20, "kahdenteenkymmenenteen")
+      , (21, "kahdenteenkymmenenteenensimmäiseen")
+      , (100, "sadanteen")
+      , (1000, "tuhannenteen")
+      ]
+    )
+  , ( "singular locative adessive"
+    , singular $ locativeAdessive defaultInflection
+    , [ (0, "nollannella")
+      , (1, "ensimmäisellä")
+      , (2, "toisella")
+      , (3, "kolmannella")
+      , (4, "neljännellä")
+      , (5, "viidennellä")
+      , (6, "kuudennella")
+      , (7, "seitsemännellä")
+      , (8, "kahdeksannella")
+      , (9, "yhdeksännellä")
+      , (10, "kymmenennellä")
+      , (11, "yhdennellätoista")
+      , (12, "kahdennellatoista")
+      , (13, "kolmannellatoista")
+      , (14, "neljännellätoista")
+      , (15, "viidennellätoista")
+      , (16, "kuudennellatoista")
+      , (17, "seitsemännellätoista")
+      , (18, "kahdeksannellatoista")
+      , (19, "yhdeksännellätoista")
+      , (20, "kahdennellakymmenennellä")
+      , (21, "kahdennellakymmenennelläensimmäisellä")
+      , (100, "sadannella")
+      , (1000, "tuhannennella")
+      ]
+    )
+  , ( "singular locative ablative"
+    , singular $ locativeAblative defaultInflection
+    , [ (0, "nollannelta")
+      , (1, "ensimmäiseltä")
+      , (2, "toiselta")
+      , (3, "kolmannelta")
+      , (4, "neljänneltä")
+      , (5, "viidenneltä")
+      , (6, "kuudennelta")
+      , (7, "seitsemänneltä")
+      , (8, "kahdeksannelta")
+      , (9, "yhdeksänneltä")
+      , (10, "kymmenenneltä")
+      , (11, "yhdenneltätoista")
+      , (12, "kahdenneltatoista")
+      , (13, "kolmanneltatoista")
+      , (14, "neljänneltätoista")
+      , (15, "viidenneltätoista")
+      , (16, "kuudenneltatoista")
+      , (17, "seitsemänneltätoista")
+      , (18, "kahdeksanneltatoista")
+      , (19, "yhdeksänneltätoista")
+      , (20, "kahdenneltakymmenenneltä")
+      , (21, "kahdenneltakymmenenneltäensimmäiseltä")
+      , (100, "sadannelta")
+      , (1000, "tuhannennelta")
+      ]
+    )
+  , ( "singular locative allative"
+    , singular $ locativeAllative defaultInflection
+    , [ (0, "nollannelle")
+      , (1, "ensimmäiselle")
+      , (2, "toiselle")
+      , (3, "kolmannelle")
+      , (4, "neljännelle")
+      , (5, "viidennelle")
+      , (6, "kuudennelle")
+      , (7, "seitsemännelle")
+      , (8, "kahdeksannelle")
+      , (9, "yhdeksännelle")
+      , (10, "kymmenennelle")
+      , (11, "yhdennelletoista")
+      , (12, "kahdennelletoista")
+      , (13, "kolmannelletoista")
+      , (14, "neljännelletoista")
+      , (15, "viidennelletoista")
+      , (16, "kuudennelletoista")
+      , (17, "seitsemännelletoista")
+      , (18, "kahdeksannelletoista")
+      , (19, "yhdeksännelletoista")
+      , (20, "kahdennellekymmenennelle")
+      , (21, "kahdennellekymmenennelleensimmäiselle")
+      , (100, "sadannelle")
+      , (1000, "tuhannennelle")
+      ]
+    )
+  , ( "singular abessive"
+    , singular $ abessive defaultInflection
+    , [ (0, "nollannetta")
+      , (1, "ensimmäisettä")
+      , (2, "toisetta")
+      , (3, "kolmannetta")
+      , (4, "neljännettä")
+      , (5, "viidennettä")
+      , (6, "kuudennetta")
+      , (7, "seitsemännettä")
+      , (8, "kahdeksannetta")
+      , (9, "yhdeksännettä")
+      , (10, "kymmenennettä")
+      , (11, "yhdennettätoista")
+      , (12, "kahdennettatoista")
+      , (13, "kolmannettatoista")
+      , (14, "neljännettätoista")
+      , (15, "viidennettätoista")
+      , (16, "kuudennettatoista")
+      , (17, "seitsemännettätoista")
+      , (18, "kahdeksannettatoista")
+      , (19, "yhdeksännettätoista")
+      , (20, "kahdennettakymmenennettä")
+      , (21, "kahdennettakymmenennettäensimmäisettä")
+      , (100, "sadannetta")
+      , (1000, "tuhannennetta")
+      ]
+    )
+  , ( "singular comitative"
+    , singular $ comitative defaultInflection
+    , [ (4, "neljänsine") ]
+    )
+  , ( "singular instructive"
+    , singular $ instructive defaultInflection
+    , [ (4, "neljänsin") ]
+    )
+  , ( "plural nominative"
+    , plural $ nominative defaultInflection
+    , [ (0, "nollannet")
+      , (1, "ensimmäiset")
+      , (2, "toiset")
+      , (3, "kolmannet")
+      , (4, "neljännet")
+      , (5, "viidennet")
+      , (6, "kuudennet")
+      , (7, "seitsemännet")
+      , (8, "kahdeksannet")
+      , (9, "yhdeksännet")
+      , (10, "kymmenennet")
+      , (11, "yhdennettoista")
+      , (12, "kahdennettoista")
+      , (13, "kolmannettoista")
+      , (14, "neljännettoista")
+      , (15, "viidennettoista")
+      , (16, "kuudennettoista")
+      , (17, "seitsemännettoista")
+      , (18, "kahdeksannettoista")
+      , (19, "yhdeksännettoista")
+      , (20, "kahdennetkymmenennet")
+      , (21, "kahdennetkymmenennetensimmäiset")
+      , (100, "sadannet")
+      , (1000, "tuhannennet")
+      ]
+    )
+  , ( "plural accusative"
+    , plural $ accusative defaultInflection
+    , [ (0, "nollannet")
+      , (1, "ensimmäiset")
+      , (2, "toiset")
+      , (3, "kolmannet")
+      , (4, "neljännet")
+      , (5, "viidennet")
+      , (6, "kuudennet")
+      , (7, "seitsemännet")
+      , (8, "kahdeksannet")
+      , (9, "yhdeksännet")
+      , (10, "kymmenennet")
+      , (11, "yhdennettoista")
+      , (12, "kahdennettoista")
+      , (13, "kolmannettoista")
+      , (14, "neljännettoista")
+      , (15, "viidennettoista")
+      , (16, "kuudennettoista")
+      , (17, "seitsemännettoista")
+      , (18, "kahdeksannettoista")
+      , (19, "yhdeksännettoista")
+      , (20, "kahdennetkymmenennet")
+      , (21, "kahdennetkymmenennetensimmäiset")
+      , (100, "sadannet")
+      , (1000, "tuhannennet")
+      ]
+    )
+  , ( "plural genitive"
+    , plural $ genitive defaultInflection
+    , [ (0, "nollansien")
+      , (1, "ensimmäisten")
+      , (2, "toisten")
+      , (3, "kolmansien")
+      , (4, "neljänsien")
+      , (5, "viidensien")
+      , (6, "kuudensien")
+      , (7, "seitsemänsien")
+      , (8, "kahdeksansien")
+      , (9, "yhdeksänsien")
+      , (10, "kymmenensien")
+      , (11, "yhdensientoista")
+      , (12, "kahdensientoista")
+      , (13, "kolmansientoista")
+      , (14, "neljänsientoista")
+      , (15, "viidensientoista")
+      , (16, "kuudensientoista")
+      , (17, "seitsemänsientoista")
+      , (18, "kahdeksansientoista")
+      , (19, "yhdeksänsientoista")
+      , (20, "kahdensienkymmenensien")
+      , (21, "kahdensienkymmenensienensimmäisten")
+      , (100, "sadansien")
+      , (1000, "tuhannensien")
+      ]
+    )
+  , ( "plural partitive"
+    , plural $ partitive defaultInflection
+    , [ (0, "nollansia")
+      , (1, "ensimmäisiä")
+      , (2, "toisia")
+      , (3, "kolmansia")
+      , (4, "neljänsiä")
+      , (5, "viidensiä")
+      , (6, "kuudensia")
+      , (7, "seitsemänsiä")
+      , (8, "kahdeksansia")
+      , (9, "yhdeksänsiä")
+      , (10, "kymmenensiä")
+      , (11, "yhdensiätoista")
+      , (12, "kahdensiatoista")
+      , (13, "kolmansiatoista")
+      , (14, "neljänsiätoista")
+      , (15, "viidensiätoista")
+      , (16, "kuudensiatoista")
+      , (17, "seitsemänsiätoista")
+      , (18, "kahdeksansiatoista")
+      , (19, "yhdeksänsiätoista")
+      , (20, "kahdensiakymmenensiä")
+      , (21, "kahdensiakymmenensiäensimmäisiä")
+      , (100, "sadansia")
+      , (1000, "tuhannensia")
+      ]
+    )
+  , ( "plural essive"
+    , plural $ essive defaultInflection
+    , [ (0, "nollansina")
+      , (1, "ensimmäisinä")
+      , (2, "toisina")
+      , (3, "kolmansina")
+      , (4, "neljänsinä")
+      , (5, "viidensinä")
+      , (6, "kuudensina")
+      , (7, "seitsemänsinä")
+      , (8, "kahdeksansina")
+      , (9, "yhdeksänsinä")
+      , (10, "kymmenensinä")
+      , (11, "yhdensinätoista")
+      , (12, "kahdensinatoista")
+      , (13, "kolmansinatoista")
+      , (14, "neljänsinätoista")
+      , (15, "viidensinätoista")
+      , (16, "kuudensinatoista")
+      , (17, "seitsemänsinätoista")
+      , (18, "kahdeksansinatoista")
+      , (19, "yhdeksänsinätoista")
+      , (20, "kahdensinakymmenensinä")
+      , (21, "kahdensinakymmenensinäensimmäisinä")
+      , (100, "sadansina")
+      , (1000, "tuhannensina")
+      ]
+    )
+  , ( "plural translative"
+    , plural $ translative defaultInflection
+    , [ (0, "nollansiksi")
+      , (1, "ensimmäisiksi")
+      , (2, "toisiksi")
+      , (3, "kolmansiksi")
+      , (4, "neljänsiksi")
+      , (5, "viidensiksi")
+      , (6, "kuudensiksi")
+      , (7, "seitsemänsiksi")
+      , (8, "kahdeksansiksi")
+      , (9, "yhdeksänsiksi")
+      , (10, "kymmenensiksi")
+      , (11, "yhdensiksitoista")
+      , (12, "kahdensiksitoista")
+      , (13, "kolmansiksitoista")
+      , (14, "neljänsiksitoista")
+      , (15, "viidensiksitoista")
+      , (16, "kuudensiksitoista")
+      , (17, "seitsemänsiksitoista")
+      , (18, "kahdeksansiksitoista")
+      , (19, "yhdeksänsissätoista")
+      , (20, "kahdensiksikymmenensiksi")
+      , (21, "kahdensiksikymmenensiksiensimmäisiksi")
+      , (100, "sadansiksi")
+      , (1000, "tuhannensiksi")
+      ]
+    )
+  , ( "plural locative inessive"
+    , plural $ locativeInessive defaultInflection
+    , [ (0, "nollansissa")
+      , (1, "ensimmäisissä")
+      , (2, "toisissa")
+      , (3, "kolmansissa")
+      , (4, "neljänsissä")
+      , (5, "viidensissä")
+      , (6, "kuudensissa")
+      , (7, "seitsemänsissä")
+      , (8, "kahdeksansissa")
+      , (9, "yhdeksänsissä")
+      , (10, "kymmenensissä")
+      , (11, "yhdensissätoista")
+      , (12, "kahdensissatoista")
+      , (13, "kolmansissatoista")
+      , (14, "neljänsissätoista")
+      , (15, "viidensissätoista")
+      , (16, "kuudensissatoista")
+      , (17, "seitsemänsissätoista")
+      , (18, "kahdeksansissatoista")
+      , (19, "yhdeksänsissätoista")
+      , (20, "kahdensissakymmenensissä")
+      , (21, "kahdensissakymmenensissäensimmäisissä")
+      , (100, "sadansissa")
+      , (1000, "tuhannensissa")
+      ]
+    )
+  , ( "plural locative elative"
+    , plural $ locativeElative defaultInflection
+    , [ (0, "nollansista")
+      , (1, "ensimmäisistä")
+      , (2, "toisista")
+      , (3, "kolmansista")
+      , (4, "neljänsistä")
+      , (5, "viidensistä")
+      , (6, "kuudensista")
+      , (7, "seitsemänsistä")
+      , (8, "kahdeksansista")
+      , (9, "yhdeksänsistä")
+      , (10, "kymmenensistä")
+      , (11, "yhdensistätoista")
+      , (12, "kahdensistatoista")
+      , (13, "kolmansistatoista")
+      , (14, "neljänsistätoista")
+      , (15, "viidensistätoista")
+      , (16, "kuudensistatoista")
+      , (17, "seitsemänsistätoista")
+      , (18, "kahdeksansistatoista")
+      , (19, "yhdeksänsistätoista")
+      , (20, "kahdensistakymmenensistä")
+      , (21, "kahdensistakymmenensistäensimmäisistä")
+      , (100, "sadansista")
+      , (1000, "tuhannensista")
+      ]
+    )
+  , ( "plural locative illative"
+    , plural $ locativeIllative defaultInflection
+    , [ (0, "nollansiin")
+      , (1, "ensimmäisiin")
+      , (2, "toisiin")
+      , (3, "kolmansiin")
+      , (4, "neljänsiin")
+      , (5, "viidensiin")
+      , (6, "kuudensiin")
+      , (7, "seitsemänsiin")
+      , (8, "kahdeksansiin")
+      , (9, "yhdeksänsiin")
+      , (10, "kymmenensiin")
+      , (11, "yhdensiintoista")
+      , (12, "kahdensiintoista")
+      , (13, "kolmansiintoista")
+      , (14, "neljänsiintoista")
+      , (15, "viidensiintoista")
+      , (16, "kuudensiintoista")
+      , (17, "seitsemänsiintoista")
+      , (18, "kahdeksansiintoista")
+      , (19, "yhdeksänsiintoista")
+      , (20, "kahdensiinkymmenensiin")
+      , (21, "kahdensiinkymmenensiinensimmäisiin")
+      , (100, "sadansiin")
+      , (1000, "tuhannensiin")
+      ]
+    )
+  , ( "plural locative adessive"
+    , plural $ locativeAdessive defaultInflection
+    , [ (0, "nollansilla")
+      , (1, "ensimmäisillä")
+      , (2, "toisilla")
+      , (3, "kolmansilla")
+      , (4, "neljänsillä")
+      , (5, "viidensillä")
+      , (6, "kuudensilla")
+      , (7, "seitsemänsillä")
+      , (8, "kahdeksansilla")
+      , (9, "yhdeksänsillä")
+      , (10, "kymmenensillä")
+      , (11, "yhdensillätoista")
+      , (12, "kahdensillatoista")
+      , (13, "kolmansillatoista")
+      , (14, "neljänsillätoista")
+      , (15, "viidensillätoista")
+      , (16, "kuudensillatoista")
+      , (17, "seitsemänsillätoista")
+      , (18, "kahdeksansillatoista")
+      , (19, "yhdeksänsillätoista")
+      , (20, "kahdensillakymmenensillä")
+      , (21, "kahdensillakymmenensilläensimmäisillä")
+      , (100, "sadansilla")
+      , (1000, "tuhannensilla")
+      ]
+    )
+  , ( "plural locative ablative"
+    , plural $ locativeAblative defaultInflection
+    , [ (0, "nollansilta")
+      , (1, "ensimmäisiltä")
+      , (2, "toisilta")
+      , (3, "kolmansilta")
+      , (4, "neljänsiltä")
+      , (5, "viidensiltä")
+      , (6, "kuudensilta")
+      , (7, "seitsemänsiltä")
+      , (8, "kahdeksansilta")
+      , (9, "yhdeksänsiltä")
+      , (10, "kymmenensiltä")
+      , (11, "yhdensitlätoista")
+      , (12, "kahdensiltatoista")
+      , (13, "kolmansiltatoista")
+      , (14, "neljänsiltätoista")
+      , (15, "viidensiltätoista")
+      , (16, "kuudensiltatoista")
+      , (17, "seitsemänsiltätoista")
+      , (18, "kahdeksansiltatoista")
+      , (19, "yhdeksänsiltätoista")
+      , (20, "kahdensiltakymmenensiltä")
+      , (21, "kahdensiltakymmenensiltäensimmäisiltä")
+      , (100, "sadansilta")
+      , (1000, "tuhannensilta")
+      ]
+    )
+  , ( "plural locative allative"
+    , plural $ locativeAllative defaultInflection
+    , [ (0, "nollansille")
+      , (1, "ensimmäisille")
+      , (2, "toisille")
+      , (3, "kolmansille")
+      , (4, "neljänsille")
+      , (5, "viidensille")
+      , (6, "kuudensille")
+      , (7, "seitsemänsille")
+      , (8, "kahdeksansille")
+      , (9, "yhdeksänsille")
+      , (10, "kymmenensille")
+      , (11, "yhdensiintoista")
+      , (12, "kahdensilletoista")
+      , (13, "kolmansilletoista")
+      , (14, "neljänsilletoista")
+      , (15, "viidensilletoista")
+      , (16, "kuudensilletoista")
+      , (17, "seitsemänsilletoista")
+      , (18, "kahdeksansilletoista")
+      , (19, "yhdeksänsilletoista")
+      , (20, "kahdensillekymmenensille")
+      , (21, "kahdensillekymmenensilleensimmäisille")
+      , (100, "sadansille")
+      , (1000, "tuhannensille")
+      ]
+    )
+  , ( "plural abessive"
+    , plural $ abessive defaultInflection
+    , [ (0, "nollansitta")
+      , (1, "ensimmäisittä")
+      , (2, "toisitta")
+      , (3, "kolmansitta")
+      , (4, "neljänsittä")
+      , (5, "viidensittä")
+      , (6, "kuudensitta")
+      , (7, "seitsemänsittä")
+      , (8, "kahdeksansitta")
+      , (9, "yhdeksänsittä")
+      , (10, "kymmenensittä")
+      , (11, "yhdensittätoista")
+      , (12, "kahdensittatoista")
+      , (13, "kolmansittatoista")
+      , (14, "neljänsittätoista")
+      , (15, "viidensittätoista")
+      , (16, "kuudensittatoista")
+      , (17, "seitsemänsittätoista")
+      , (18, "kahdeksansittatoista")
+      , (19, "yhdeksänsittätoista")
+      , (20, "kahdensittakymmenensittä")
+      , (21, "kahdensittakymmenensittäensimmäisittä")
+      , (100, "sadansitta")
+      , (1000, "tuhannensitta")
+      ]
+    )
+  , ( "plural comitative"
+    , plural $ comitative defaultInflection
+    , [ (0, "nollansine")
+      , (1, "ensimmäisine")
+      , (2, "toisine")
+      , (3, "kolmansine")
+      , (4, "neljänsine")
+      , (5, "viidensine")
+      , (6, "kuudensine")
+      , (7, "seitsemänsine")
+      , (8, "kahdeksansine")
+      , (9, "yhdeksänsine")
+      , (10, "kymmenensine")
+      , (11, "yhdensinetoista")
+      , (12, "kahdensinetoista")
+      , (13, "kolmansinetoista")
+      , (14, "neljänsinetoista")
+      , (15, "viidensinetoista")
+      , (16, "kuudensinetoista")
+      , (17, "seitsemänsinetoista")
+      , (18, "kahdeksansinetoista")
+      , (19, "yhdeksänsinetoista")
+      , (20, "kahdensinekymmenensine")
+      , (21, "kahdensinekymmenensineensimmäisine")
+      , (100, "sadansine")
+      , (1000, "tuhannensine")
+      ]
+    )
+  , ( "plural instructive"
+    , plural $ instructive defaultInflection
+    , [ (0, "nollansin")
+      , (1, "ensimmäisin")
+      , (2, "toisin")
+      , (3, "kolmansin")
+      , (4, "neljänsin")
+      , (5, "viidensin")
+      , (6, "kuudensin")
+      , (7, "seitsemänsin")
+      , (8, "kahdeksansin")
+      , (9, "yhdeksänsin")
+      , (10, "kymmenensin")
+      , (11, "yhdensintoista")
+      , (12, "kahdensintoista")
+      , (13, "kolmansintoista")
+      , (14, "neljänsintoista")
+      , (15, "viidensintoista")
+      , (16, "kuudensintoista")
+      , (17, "seitsemänsintoista")
+      , (18, "kahdeksansintoista")
+      , (19, "yhdeksänsintoista")
+      , (20, "kahdensinkymmenensin")
+      , (21, "kahdensinkymmenensinensimmäisin")
+      , (100, "sadansin")
+      , (1000, "tuhannensin")
+      ]
+    )
+  ]
+
+multiplicatives :: (Integral i) => TestData i
+multiplicatives =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "kerran")
+      , (2, "kahdesti")
+      , (6, "kuudesti")
+      ]
+    )
+  ]
+
+multipliers :: (Integral i) => TestData i
+multipliers =
+  [ ( "default"
+    , defaultInflection
+    , [ (6, "kuusinkertainen")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/FO/TestData.hs b/src-test/Text/Numeral/Language/FO/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/FO/TestData.hs
+++ /dev/null
@@ -1,225 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        fo
-
-[@ISO639-2@]        fao
-
-[@ISO639-3@]        fao
-
-[@Native name@]     føroyskt
-
-[@English name@]    Faroese
--}
-module Text.Numeral.Language.FO.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-faroese/en/fao/
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "null")
-      , (1, "ein")
-      , (2, "tveir")
-      , (3, "tríggir")
-      , (4, "fýra")
-      , (5, "fimm")
-      , (6, "seks")
-      , (7, "sjey")
-      , (8, "átta")
-      , (9, "níggju")
-      , (10, "tíggju")
-      , (11, "ellivu")
-      , (12, "tólv")
-      , (13, "trettan")
-      , (14, "fjúrtan")
-      , (15, "fimtan")
-      , (16, "sekstan")
-      , (17, "seytjan")
-      , (18, "átjan")
-      , (19, "nítjan")
-      , (20, "tjúgu")
-      , (21, "ein og tjúgu")
-      , (22, "tveir og tjúgu")
-      , (23, "tríggir og tjúgu")
-      , (24, "fýra og tjúgu")
-      , (25, "fimm og tjúgu")
-      , (26, "seks og tjúgu")
-      , (27, "sjey og tjúgu")
-      , (28, "átta og tjúgu")
-      , (29, "níggju og tjúgu")
-      , (30, "tríati")
-      , (31, "ein og tríati")
-      , (32, "tveir og tríati")
-      , (33, "tríggir og tríati")
-      , (34, "fýra og tríati")
-      , (35, "fimm og tríati")
-      , (36, "seks og tríati")
-      , (37, "sjey og tríati")
-      , (38, "átta og tríati")
-      , (39, "níggju og tríati")
-      , (40, "fýrati")
-      , (41, "ein og fýrati")
-      , (42, "tveir og fýrati")
-      , (43, "tríggir og fýrati")
-      , (44, "fýra og fýrati")
-      , (45, "fimm og fýrati")
-      , (46, "seks og fýrati")
-      , (47, "sjey og fýrati")
-      , (48, "átta og fýrati")
-      , (49, "níggju og fýrati")
-      , (50, "fimmti")
-      , (51, "ein og fimmti")
-      , (52, "tveir og fimmti")
-      , (53, "tríggir og fimmti")
-      , (54, "fýra og fimmti")
-      , (55, "fimm og fimmti")
-      , (56, "seks og fimmti")
-      , (57, "sjey og fimmti")
-      , (58, "átta og fimmti")
-      , (59, "níggju og fimmti")
-      , (60, "seksti")
-      , (61, "ein og seksti")
-      , (62, "tveir og seksti")
-      , (63, "tríggir og seksti")
-      , (64, "fýra og seksti")
-      , (65, "fimm og seksti")
-      , (66, "seks og seksti")
-      , (67, "sjey og seksti")
-      , (68, "átta og seksti")
-      , (69, "níggju og seksti")
-      , (70, "sjeyti")
-      , (71, "ein og sjeyti")
-      , (72, "tveir og sjeyti")
-      , (73, "tríggir og sjeyti")
-      , (74, "fýra og sjeyti")
-      , (75, "fimm og sjeyti")
-      , (76, "seks og sjeyti")
-      , (77, "sjey og sjeyti")
-      , (78, "átta og sjeyti")
-      , (79, "níggju og sjeyti")
-      , (80, "áttati")
-      , (81, "ein og áttati")
-      , (82, "tveir og áttati")
-      , (83, "tríggir og áttati")
-      , (84, "fýra og áttati")
-      , (85, "fimm og áttati")
-      , (86, "seks og áttati")
-      , (87, "sjey og áttati")
-      , (88, "átta og áttati")
-      , (89, "níggju og áttati")
-      , (90, "níti")
-      , (91, "ein og níti")
-      , (92, "tveir og níti")
-      , (93, "tríggir og níti")
-      , (94, "fýra og níti")
-      , (95, "fimm og níti")
-      , (96, "seks og níti")
-      , (97, "sjey og níti")
-      , (98, "átta og níti")
-      , (99, "níggju og níti")
-      , (100, "hundrað")
-      , (101, "hundrað og ein")
-      , (102, "hundrað og tveir")
-      , (103, "hundrað og tríggir")
-      , (104, "hundrað og fýra")
-      , (105, "hundrað og fimm")
-      , (106, "hundrað og seks")
-      , (107, "hundrað og sjey")
-      , (108, "hundrað og átta")
-      , (109, "hundrað og níggju")
-      , (110, "hundrað og tíggju")
-      , (123, "hundrað og tríggir og tjúgu")
-      , (200, "tvey hundrað")
-      , (300, "trý hundrað")
-      , (321, "trý hundrað og ein og tjúgu")
-      , (400, "fýra hundrað")
-      , (500, "fimm hundrað")
-      , (600, "seks hundrað")
-      , (700, "sjey hundrað")
-      , (800, "átta hundrað")
-      , (900, "níggju hundrað")
-      , (909, "níggju hundrað og níggju")
-      , (990, "níggju hundrað og níti")
-      , (999, "níggju hundrað og níggju og níti")
-      , (1000, "túsund")
-      , (1001, "eitt túsund og ein")
-      , (1008, "eitt túsund og átta")
-      , (1234, "eitt túsund tvey hundrað og fýra og tríati")
-      , (2000, "tvey túsund")
-      , (3000, "trý túsund")
-      , (4000, "fýra túsund")
-      , (4321, "fýra túsund trý hundrað og ein og tjúgu")
-      , (5000, "fimm túsund")
-      , (6000, "seks túsund")
-      , (7000, "sjey túsund")
-      , (8000, "átta túsund")
-      , (9000, "níggju túsund")
-      , (10000, "tíggju túsund")
-      , (12345, "tólv túsund trý hundrað og fimm og fýrati")
-      , (20000, "tjúgu túsund")
-      , (30000, "tríati túsund")
-      , (40000, "fýrati túsund")
-      , (50000, "fimmti túsund")
-      , (54321, "fýra og fimmti túsund trý hundrað og ein og tjúgu")
-      , (60000, "seksti túsund")
-      , (70000, "sjeyti túsund")
-      , (80000, "áttati túsund")
-      , (90000, "níti túsund")
-      , (100000, "hundrað túsund")
-      , (123456, "hundrað og tríggir og tjúgu túsund og fýra hundrað og seks og fimmti")
-      , (200000, "tvey hundrað túsund")
-      , (300000, "trý hundrað túsund")
-      , (400000, "fýra hundrað túsund")
-      , (500000, "fimm hundrað túsund")
-      , (600000, "seks hundrað túsund")
-      , (654321, "seks hundrað og fýra og fimmti túsund trý hundrað og ein og tjúgu")
-      , (700000, "sjey hundrað túsund")
-      , (800000, "átta hundrað túsund")
-      , (900000, "níggju hundrað túsund")
-      , (1000000, "ein millión")
-      , (1000001, "ein millión og ein")
-      , (1234567, "ein millión tvey hundrað og fýra og tríati túsund og fimm hundrað og sjey og seksti")
-      , (2000000, "tvær milliónir")
-      , (3000000, "tríggjar milliónir")
-      , (4000000, "fýra milliónir")
-      , (5000000, "fimm milliónir")
-      , (6000000, "seks milliónir")
-      , (7000000, "sjey milliónir")
-      , (7654321, "sjey milliónir og seks hundrað og fýra og fimmti túsund trý hundrað og ein og tjúgu")
-      , (8000000, "átta milliónir")
-      , (9000000, "níggju milliónir")
-      , (1000000000, "ein milliard")
-      , (1000000001, "ein milliard og ein")
-      , (2000000000, "tveir milliardir")
-      , (3000000000, "tríggir milliardir")
-      , (4000000000, "fýra milliardir")
-      , (5000000000, "fimm milliardir")
-      , (6000000000, "seks milliardir")
-      , (7000000000, "sjey milliardir")
-      , (8000000000, "átta milliardir")
-      , (9000000000, "níggju milliardir")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/FR/TestData.hs b/src-test/Text/Numeral/Language/FR/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/FR/TestData.hs
+++ /dev/null
@@ -1,371 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        fr
-
-[@ISO639-2B@]       fre
-
-[@ISO639-3@]        fra
-
-[@Native name@]     Français
-
-[@English name@]    French
--}
-
-module Text.Numeral.Language.FR.TestData (cardinals, ordinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.sf.airnet.ne.jp/~ts/language/number/french.html
-  http://www.french-linguistics.co.uk/tutorials/numbers/
-  http://www.parisbypod.com/2007/10/23/french-ordinal-numbers/
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "masculine"
-    , masculine defaultInflection
-    , [ (0, "zéro")
-      , (1, "un")
-      , (2, "deux")
-      , (3, "trois")
-      , (4, "quatre")
-      , (5, "cinq")
-      , (6, "six")
-      , (7, "sept")
-      , (8, "huit")
-      , (9, "neuf")
-      , (10, "dix")
-      , (11, "onze")
-      , (12, "douze")
-      , (13, "treize")
-      , (14, "quatorze")
-      , (15, "quinze")
-      , (16, "seize")
-      , (17, "dix-sept")
-      , (18, "dix-huit")
-      , (19, "dix-neuf")
-      , (20, "vingt")
-      , (21, "vingt et un")
-      , (22, "vingt-deux")
-      , (23, "vingt-trois")
-      , (24, "vingt-quatre")
-      , (25, "vingt-cinq")
-      , (26, "vingt-six")
-      , (27, "vingt-sept")
-      , (28, "vingt-huit")
-      , (29, "vingt-neuf")
-      , (30, "trente")
-      , (31, "trente et un")
-      , (32, "trente-deux")
-      , (33, "trente-trois")
-      , (34, "trente-quatre")
-      , (35, "trente-cinq")
-      , (36, "trente-six")
-      , (37, "trente-sept")
-      , (38, "trente-huit")
-      , (39, "trente-neuf")
-      , (40, "quarante")
-      , (41, "quarante et un")
-      , (42, "quarante-deux")
-      , (43, "quarante-trois")
-      , (44, "quarante-quatre")
-      , (45, "quarante-cinq")
-      , (46, "quarante-six")
-      , (47, "quarante-sept")
-      , (48, "quarante-huit")
-      , (49, "quarante-neuf")
-      , (50, "cinquante")
-      , (51, "cinquante et un")
-      , (52, "cinquante-deux")
-      , (53, "cinquante-trois")
-      , (54, "cinquante-quatre")
-      , (55, "cinquante-cinq")
-      , (56, "cinquante-six")
-      , (57, "cinquante-sept")
-      , (58, "cinquante-huit")
-      , (59, "cinquante-neuf")
-      , (60, "soixante")
-      , (61, "soixante et un")
-      , (62, "soixante-deux")
-      , (63, "soixante-trois")
-      , (64, "soixante-quatre")
-      , (65, "soixante-cinq")
-      , (66, "soixante-six")
-      , (67, "soixante-sept")
-      , (68, "soixante-huit")
-      , (69, "soixante-neuf")
-      , (70, "soixante-dix")
-      , (71, "soixante et onze")
-      , (72, "soixante-douze")
-      , (73, "soixante-treize")
-      , (74, "soixante-quatorze")
-      , (75, "soixante-quinze")
-      , (76, "soixante-seize")
-      , (77, "soixante-dix-sept")
-      , (78, "soixante-dix-huit")
-      , (79, "soixante-dix-neuf")
-      , (80, "quatre-vingts")
-      , (81, "quatre-vingt-un")
-      , (82, "quatre-vingt-deux")
-      , (83, "quatre-vingt-trois")
-      , (84, "quatre-vingt-quatre")
-      , (85, "quatre-vingt-cinq")
-      , (86, "quatre-vingt-six")
-      , (87, "quatre-vingt-sept")
-      , (88, "quatre-vingt-huit")
-      , (89, "quatre-vingt-neuf")
-      , (90, "quatre-vingt-dix")
-      , (91, "quatre-vingt-onze")
-      , (92, "quatre-vingt-douze")
-      , (93, "quatre-vingt-treize")
-      , (94, "quatre-vingt-quatorze")
-      , (95, "quatre-vingt-quinze")
-      , (96, "quatre-vingt-seize")
-      , (97, "quatre-vingt-dix-sept")
-      , (98, "quatre-vingt-dix-huit")
-      , (99, "quatre-vingt-dix-neuf")
-      , (100, "cent")
-      , (101, "cent et un")
-      , (102, "cent deux")
-      , (103, "cent trois")
-      , (104, "cent quatre")
-      , (105, "cent cinq")
-      , (111, "cent et onze")
-      , (122, "cent vingt-deux")
-      , (123, "cent vingt-trois")
-      , (144, "cent quarante-quatre")
-      , (196, "cent quatre-vingt-seize")
-      , (199, "cent quatre-vingt-dix-neuf")
-      , (200, "deux cents")
-      , (300, "trois cents")
-      , (400, "quatre cents")
-      , (500, "cinq cents")
-      , (600, "six cents")
-      , (700, "sept cents")
-      , (800, "huit cents")
-      , (900, "neuf cents")
-      , (1000, "mille")
-      , (1999, "mille neuf cent quatre-vingt-dix-neuf")
-      , (2000, "deux mille")
-      , (2999, "deux mille neuf cent quatre-vingt-dix-neuf")
-      , (dec 4, "dix mille")
-      , (dec 5, "cent mille")
-      , (dec 6, "un million")
-      , (dec 9, "un milliard")
-      , (dec 12, "un billion")
-      , (dec 15, "un billiard")
-      , (dec 18, "un trillion")
-      , (dec 21, "un trilliard")
-      , (dec 24, "un quadrillion")
-      , (dec 27, "un quadrilliard")
-      , (dec 30, "un quintillion")
-      , (dec 33, "un quintilliard")
-      , (dec 36, "un sextillion")
-      , (dec 39, "un sextilliard")
-      , (dec 42, "un septillion")
-      , (dec 45, "un septilliard")
-      , (dec 48, "un octillion")
-      , (dec 51, "un octilliard")
-      , (dec 54, "un nonillion")
-      , (dec 57, "un nonilliard")
-      , (dec 60, "un décillion")
-      , (dec 63, "un décilliard")
-      , (dec 66, "un unodécillion")
-      , (dec 69, "un unodécilliard")
-      , (dec 72, "un duodécillion")
-      , (dec 75, "un duodécilliard")
-      , (dec 78, "un trédécillion")
-      , (dec 81, "un trédécilliard")
-      , (dec 84, "un quattuordécillion")
-      , (dec 87, "un quattuordécilliard")
-      , (dec 90, "un quindécillion")
-      , (dec 93, "un quindécilliard")
-      , (dec 96, "un sexdécillion")
-      , (dec 99, "un sexdécilliard")
-      , (dec 102, "un septendécillion")
-      , (dec 105, "un septendécilliard")
-      , (dec 108, "un octodécillion")
-      , (dec 111, "un octodécilliard")
-      , (dec 114, "un novemdécillion")
-      , (dec 117, "un novemdécilliard")
-      , (dec 120, "un vigintillion")
-      , (dec 123, "un vigintilliard")
-      , (dec 150, "un quinquavigintillion")
-      , (dec 153, "un quinquavigintilliard")
-      , (dec 180, "un trigintillion")
-      , (dec 183, "un trigintilliard")
-      , (dec 210, "un quinquatrigintillion")
-      , (dec 213, "un quinquatrigintilliard")
-      , (dec 240, "un quadragintillion")
-      , (dec 243, "un quadragintilliard")
-      , (dec 270, "un quinquaquadragintillion")
-      , (dec 273, "un quinquaquadragintilliard")
-      , (dec 300, "un quinquagintillion")
-      , (dec 303, "un quinquagintilliard")
-      , (dec 306, "un unoquinquagintillion")
-      , (dec 309, "un unoquinquagintilliard")
-      , (dec 360, "un sexagintillion")
-      , (dec 363, "un sexagintilliard")
-      , (dec 420, "un septuagintillion")
-      , (dec 423, "un septuagintilliard")
-      , (dec 480, "un octogintillion")
-      , (dec 483, "un octogintilliard")
-      , (dec 540, "un nonagintillion")
-      , (dec 543, "un nonagintilliard")
-      , (dec 600, "un centillion")
-      , (dec 603, "un centilliard")
-      ]
-    )
-  , ( "feminine"
-    , feminine defaultInflection
-    , [ (1, "une")
-      ]
-    )
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals =
-  [ ( "masculine"
-    , masculine defaultInflection
-    , [ (0, "zéroth")
-      , (1, "premier")
-      , (2, "deuxième")
-      , (3, "troisième")
-      , (4, "quatrième")
-      , (5, "cinquième")
-      , (6, "sixième")
-      , (7, "septième")
-      , (8, "huitième")
-      , (9, "neuvième")
-      , (10, "dixième")
-      , (11, "onzième")
-      , (12, "douzième")
-      , (13, "treizième")
-      , (14, "quatorzième")
-      , (15, "quinzième")
-      , (16, "seizième")
-      , (17, "dix-septième")
-      , (18, "dix-huitième")
-      , (19, "dix-neuvième")
-      , (20, "vingtième")
-      , (21, "vingt et unième")
-      , (22, "vingt-deuxième")
-      , (23, "vingt-troisième")
-      , (24, "vingt-quatrième")
-      , (25, "vingt-cinquième")
-      , (26, "vingt-sixième")
-      , (27, "vingt-septième")
-      , (28, "vingt-huitième")
-      , (29, "vingt-neuvième")
-      , (30, "trentième")
-      , (31, "trente et unième")
-      , (32, "trente-deuxième")
-      , (33, "trente-troisième")
-      , (34, "trente-quatrième")
-      , (35, "trente-cinquième")
-      , (36, "trente-sixième")
-      , (37, "trente-septième")
-      , (38, "trente-huitième")
-      , (39, "trente-neuvième")
-      , (40, "quarantième")
-      , (41, "quarante et unième")
-      , (42, "quarante-deuxième")
-      , (43, "quarante-troisième")
-      , (44, "quarante-quatrième")
-      , (45, "quarante-cinquième")
-      , (46, "quarante-sixième")
-      , (47, "quarante-septième")
-      , (48, "quarante-huitième")
-      , (49, "quarante-neuvième")
-      , (50, "cinquantième")
-      , (51, "cinquante et unième")
-      , (52, "cinquante-deuxième")
-      , (53, "cinquante-troisième")
-      , (54, "cinquante-quatrième")
-      , (55, "cinquante-cinquième")
-      , (56, "cinquante-sixième")
-      , (57, "cinquante-septième")
-      , (58, "cinquante-huitième")
-      , (59, "cinquante-neuvième")
-      , (60, "soixantième")
-      , (61, "soixante et unième")
-      , (62, "soixante-deuxième")
-      , (63, "soixante-troisième")
-      , (64, "soixante-quatrième")
-      , (65, "soixante-cinquième")
-      , (66, "soixante-sixième")
-      , (67, "soixante-septième")
-      , (68, "soixante-huitième")
-      , (69, "soixante-neuvième")
-      , (70, "soixante-dixième")
-      , (71, "soixante et onzième")
-      , (72, "soixante-douzième")
-      , (73, "soixante-treizième")
-      , (74, "soixante-quatorzième")
-      , (75, "soixante-quinzième")
-      , (76, "soixante-seizième")
-      , (77, "soixante-dix-septième")
-      , (78, "soixante-dix-huitième")
-      , (79, "soixante-dix-neuvième")
-      , (80, "quatre-vingtième")
-      , (81, "quatre-vingt-unième")
-      , (82, "quatre-vingt-deuxième")
-      , (83, "quatre-vingt-troisième")
-      , (84, "quatre-vingt-quatrième")
-      , (85, "quatre-vingt-cinquième")
-      , (86, "quatre-vingt-sixième")
-      , (87, "quatre-vingt-septième")
-      , (88, "quatre-vingt-huitième")
-      , (89, "quatre-vingt-neuvième")
-      , (90, "quatre-vingt-dixième")
-      , (91, "quatre-vingt-onzième")
-      , (92, "quatre-vingt-douzième")
-      , (93, "quatre-vingt-treizième")
-      , (94, "quatre-vingt-quatorzième")
-      , (95, "quatre-vingt-quinzième")
-      , (96, "quatre-vingt-seizième")
-      , (97, "quatre-vingt-dix-septième")
-      , (98, "quatre-vingt-dix-huitième")
-      , (99, "quatre-vingt-dix-neuvième")
-      , (100, "centième")
-      , (200, "deux centième")
-      , (300, "trois centième")
-      , (400, "quatre centième")
-      , (500, "cinq centième")
-      , (600, "six centième")
-      , (700, "sept centième")
-      , (800, "huit centième")
-      , (900, "neuf centième")
-      , (1000, "millième")
-      , (dec 6, "millionième")
-      , (dec 9, "milliardième")
-      ]
-    )
-  , ( "feminine"
-    , feminine defaultInflection
-    , [ (1, "première")
-      , (41, "quarante et uneième")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/FRA/TestData.hs b/src-test/Text/Numeral/Language/FRA/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/FRA/TestData.hs
@@ -0,0 +1,364 @@
+{-|
+[@ISO639-1@]        fr
+
+[@ISO639-2B@]       fre
+
+[@ISO639-3@]        fra
+
+[@Native name@]     Français
+
+[@English name@]    French
+-}
+
+module Text.Numeral.Language.FRA.TestData (cardinals, ordinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.sf.airnet.ne.jp/~ts/language/number/french.html
+  http://www.french-linguistics.co.uk/tutorials/numbers/
+  http://www.parisbypod.com/2007/10/23/french-ordinal-numbers/
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "masculine"
+    , masculine defaultInflection
+    , [ (0, "zéro")
+      , (1, "un")
+      , (2, "deux")
+      , (3, "trois")
+      , (4, "quatre")
+      , (5, "cinq")
+      , (6, "six")
+      , (7, "sept")
+      , (8, "huit")
+      , (9, "neuf")
+      , (10, "dix")
+      , (11, "onze")
+      , (12, "douze")
+      , (13, "treize")
+      , (14, "quatorze")
+      , (15, "quinze")
+      , (16, "seize")
+      , (17, "dix-sept")
+      , (18, "dix-huit")
+      , (19, "dix-neuf")
+      , (20, "vingt")
+      , (21, "vingt et un")
+      , (22, "vingt-deux")
+      , (23, "vingt-trois")
+      , (24, "vingt-quatre")
+      , (25, "vingt-cinq")
+      , (26, "vingt-six")
+      , (27, "vingt-sept")
+      , (28, "vingt-huit")
+      , (29, "vingt-neuf")
+      , (30, "trente")
+      , (31, "trente et un")
+      , (32, "trente-deux")
+      , (33, "trente-trois")
+      , (34, "trente-quatre")
+      , (35, "trente-cinq")
+      , (36, "trente-six")
+      , (37, "trente-sept")
+      , (38, "trente-huit")
+      , (39, "trente-neuf")
+      , (40, "quarante")
+      , (41, "quarante et un")
+      , (42, "quarante-deux")
+      , (43, "quarante-trois")
+      , (44, "quarante-quatre")
+      , (45, "quarante-cinq")
+      , (46, "quarante-six")
+      , (47, "quarante-sept")
+      , (48, "quarante-huit")
+      , (49, "quarante-neuf")
+      , (50, "cinquante")
+      , (51, "cinquante et un")
+      , (52, "cinquante-deux")
+      , (53, "cinquante-trois")
+      , (54, "cinquante-quatre")
+      , (55, "cinquante-cinq")
+      , (56, "cinquante-six")
+      , (57, "cinquante-sept")
+      , (58, "cinquante-huit")
+      , (59, "cinquante-neuf")
+      , (60, "soixante")
+      , (61, "soixante et un")
+      , (62, "soixante-deux")
+      , (63, "soixante-trois")
+      , (64, "soixante-quatre")
+      , (65, "soixante-cinq")
+      , (66, "soixante-six")
+      , (67, "soixante-sept")
+      , (68, "soixante-huit")
+      , (69, "soixante-neuf")
+      , (70, "soixante-dix")
+      , (71, "soixante et onze")
+      , (72, "soixante-douze")
+      , (73, "soixante-treize")
+      , (74, "soixante-quatorze")
+      , (75, "soixante-quinze")
+      , (76, "soixante-seize")
+      , (77, "soixante-dix-sept")
+      , (78, "soixante-dix-huit")
+      , (79, "soixante-dix-neuf")
+      , (80, "quatre-vingts")
+      , (81, "quatre-vingt-un")
+      , (82, "quatre-vingt-deux")
+      , (83, "quatre-vingt-trois")
+      , (84, "quatre-vingt-quatre")
+      , (85, "quatre-vingt-cinq")
+      , (86, "quatre-vingt-six")
+      , (87, "quatre-vingt-sept")
+      , (88, "quatre-vingt-huit")
+      , (89, "quatre-vingt-neuf")
+      , (90, "quatre-vingt-dix")
+      , (91, "quatre-vingt-onze")
+      , (92, "quatre-vingt-douze")
+      , (93, "quatre-vingt-treize")
+      , (94, "quatre-vingt-quatorze")
+      , (95, "quatre-vingt-quinze")
+      , (96, "quatre-vingt-seize")
+      , (97, "quatre-vingt-dix-sept")
+      , (98, "quatre-vingt-dix-huit")
+      , (99, "quatre-vingt-dix-neuf")
+      , (100, "cent")
+      , (101, "cent et un")
+      , (102, "cent deux")
+      , (103, "cent trois")
+      , (104, "cent quatre")
+      , (105, "cent cinq")
+      , (111, "cent et onze")
+      , (122, "cent vingt-deux")
+      , (123, "cent vingt-trois")
+      , (144, "cent quarante-quatre")
+      , (196, "cent quatre-vingt-seize")
+      , (199, "cent quatre-vingt-dix-neuf")
+      , (200, "deux cents")
+      , (300, "trois cents")
+      , (400, "quatre cents")
+      , (500, "cinq cents")
+      , (600, "six cents")
+      , (700, "sept cents")
+      , (800, "huit cents")
+      , (900, "neuf cents")
+      , (1000, "mille")
+      , (1999, "mille neuf cent quatre-vingt-dix-neuf")
+      , (2000, "deux mille")
+      , (2999, "deux mille neuf cent quatre-vingt-dix-neuf")
+      , (dec 4, "dix mille")
+      , (dec 5, "cent mille")
+      , (dec 6, "un million")
+      , (dec 9, "un milliard")
+      , (dec 12, "un billion")
+      , (dec 15, "un billiard")
+      , (dec 18, "un trillion")
+      , (dec 21, "un trilliard")
+      , (dec 24, "un quadrillion")
+      , (dec 27, "un quadrilliard")
+      , (dec 30, "un quintillion")
+      , (dec 33, "un quintilliard")
+      , (dec 36, "un sextillion")
+      , (dec 39, "un sextilliard")
+      , (dec 42, "un septillion")
+      , (dec 45, "un septilliard")
+      , (dec 48, "un octillion")
+      , (dec 51, "un octilliard")
+      , (dec 54, "un nonillion")
+      , (dec 57, "un nonilliard")
+      , (dec 60, "un décillion")
+      , (dec 63, "un décilliard")
+      , (dec 66, "un unodécillion")
+      , (dec 69, "un unodécilliard")
+      , (dec 72, "un duodécillion")
+      , (dec 75, "un duodécilliard")
+      , (dec 78, "un trédécillion")
+      , (dec 81, "un trédécilliard")
+      , (dec 84, "un quattuordécillion")
+      , (dec 87, "un quattuordécilliard")
+      , (dec 90, "un quindécillion")
+      , (dec 93, "un quindécilliard")
+      , (dec 96, "un sexdécillion")
+      , (dec 99, "un sexdécilliard")
+      , (dec 102, "un septendécillion")
+      , (dec 105, "un septendécilliard")
+      , (dec 108, "un octodécillion")
+      , (dec 111, "un octodécilliard")
+      , (dec 114, "un novemdécillion")
+      , (dec 117, "un novemdécilliard")
+      , (dec 120, "un vigintillion")
+      , (dec 123, "un vigintilliard")
+      , (dec 150, "un quinquavigintillion")
+      , (dec 153, "un quinquavigintilliard")
+      , (dec 180, "un trigintillion")
+      , (dec 183, "un trigintilliard")
+      , (dec 210, "un quinquatrigintillion")
+      , (dec 213, "un quinquatrigintilliard")
+      , (dec 240, "un quadragintillion")
+      , (dec 243, "un quadragintilliard")
+      , (dec 270, "un quinquaquadragintillion")
+      , (dec 273, "un quinquaquadragintilliard")
+      , (dec 300, "un quinquagintillion")
+      , (dec 303, "un quinquagintilliard")
+      , (dec 306, "un unoquinquagintillion")
+      , (dec 309, "un unoquinquagintilliard")
+      , (dec 360, "un sexagintillion")
+      , (dec 363, "un sexagintilliard")
+      , (dec 420, "un septuagintillion")
+      , (dec 423, "un septuagintilliard")
+      , (dec 480, "un octogintillion")
+      , (dec 483, "un octogintilliard")
+      , (dec 540, "un nonagintillion")
+      , (dec 543, "un nonagintilliard")
+      , (dec 600, "un centillion")
+      , (dec 603, "un centilliard")
+      ]
+    )
+  , ( "feminine"
+    , feminine defaultInflection
+    , [ (1, "une")
+      ]
+    )
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals =
+  [ ( "masculine"
+    , masculine defaultInflection
+    , [ (0, "zéroth")
+      , (1, "premier")
+      , (2, "deuxième")
+      , (3, "troisième")
+      , (4, "quatrième")
+      , (5, "cinquième")
+      , (6, "sixième")
+      , (7, "septième")
+      , (8, "huitième")
+      , (9, "neuvième")
+      , (10, "dixième")
+      , (11, "onzième")
+      , (12, "douzième")
+      , (13, "treizième")
+      , (14, "quatorzième")
+      , (15, "quinzième")
+      , (16, "seizième")
+      , (17, "dix-septième")
+      , (18, "dix-huitième")
+      , (19, "dix-neuvième")
+      , (20, "vingtième")
+      , (21, "vingt et unième")
+      , (22, "vingt-deuxième")
+      , (23, "vingt-troisième")
+      , (24, "vingt-quatrième")
+      , (25, "vingt-cinquième")
+      , (26, "vingt-sixième")
+      , (27, "vingt-septième")
+      , (28, "vingt-huitième")
+      , (29, "vingt-neuvième")
+      , (30, "trentième")
+      , (31, "trente et unième")
+      , (32, "trente-deuxième")
+      , (33, "trente-troisième")
+      , (34, "trente-quatrième")
+      , (35, "trente-cinquième")
+      , (36, "trente-sixième")
+      , (37, "trente-septième")
+      , (38, "trente-huitième")
+      , (39, "trente-neuvième")
+      , (40, "quarantième")
+      , (41, "quarante et unième")
+      , (42, "quarante-deuxième")
+      , (43, "quarante-troisième")
+      , (44, "quarante-quatrième")
+      , (45, "quarante-cinquième")
+      , (46, "quarante-sixième")
+      , (47, "quarante-septième")
+      , (48, "quarante-huitième")
+      , (49, "quarante-neuvième")
+      , (50, "cinquantième")
+      , (51, "cinquante et unième")
+      , (52, "cinquante-deuxième")
+      , (53, "cinquante-troisième")
+      , (54, "cinquante-quatrième")
+      , (55, "cinquante-cinquième")
+      , (56, "cinquante-sixième")
+      , (57, "cinquante-septième")
+      , (58, "cinquante-huitième")
+      , (59, "cinquante-neuvième")
+      , (60, "soixantième")
+      , (61, "soixante et unième")
+      , (62, "soixante-deuxième")
+      , (63, "soixante-troisième")
+      , (64, "soixante-quatrième")
+      , (65, "soixante-cinquième")
+      , (66, "soixante-sixième")
+      , (67, "soixante-septième")
+      , (68, "soixante-huitième")
+      , (69, "soixante-neuvième")
+      , (70, "soixante-dixième")
+      , (71, "soixante et onzième")
+      , (72, "soixante-douzième")
+      , (73, "soixante-treizième")
+      , (74, "soixante-quatorzième")
+      , (75, "soixante-quinzième")
+      , (76, "soixante-seizième")
+      , (77, "soixante-dix-septième")
+      , (78, "soixante-dix-huitième")
+      , (79, "soixante-dix-neuvième")
+      , (80, "quatre-vingtième")
+      , (81, "quatre-vingt-unième")
+      , (82, "quatre-vingt-deuxième")
+      , (83, "quatre-vingt-troisième")
+      , (84, "quatre-vingt-quatrième")
+      , (85, "quatre-vingt-cinquième")
+      , (86, "quatre-vingt-sixième")
+      , (87, "quatre-vingt-septième")
+      , (88, "quatre-vingt-huitième")
+      , (89, "quatre-vingt-neuvième")
+      , (90, "quatre-vingt-dixième")
+      , (91, "quatre-vingt-onzième")
+      , (92, "quatre-vingt-douzième")
+      , (93, "quatre-vingt-treizième")
+      , (94, "quatre-vingt-quatorzième")
+      , (95, "quatre-vingt-quinzième")
+      , (96, "quatre-vingt-seizième")
+      , (97, "quatre-vingt-dix-septième")
+      , (98, "quatre-vingt-dix-huitième")
+      , (99, "quatre-vingt-dix-neuvième")
+      , (100, "centième")
+      , (200, "deux centième")
+      , (300, "trois centième")
+      , (400, "quatre centième")
+      , (500, "cinq centième")
+      , (600, "six centième")
+      , (700, "sept centième")
+      , (800, "huit centième")
+      , (900, "neuf centième")
+      , (1000, "millième")
+      , (dec 6, "millionième")
+      , (dec 9, "milliardième")
+      ]
+    )
+  , ( "feminine"
+    , feminine defaultInflection
+    , [ (1, "première")
+      , (41, "quarante et uneième")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/FRA_JER/TestData.hs b/src-test/Text/Numeral/Language/FRA_JER/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/FRA_JER/TestData.hs
@@ -0,0 +1,162 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        -
+
+[@Native name@]     -
+
+[@English name@]    Jèrriais
+-}
+module Text.Numeral.Language.FRA_JER.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-jerriais/en/fra-jer/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "ieune")
+      , (2, "deux")
+      , (3, "trais")
+      , (4, "quat’")
+      , (5, "chîn")
+      , (6, "six")
+      , (7, "sept")
+      , (8, "huit")
+      , (9, "neuf")
+      , (10, "dgix")
+      , (11, "onze")
+      , (12, "douze")
+      , (13, "treize")
+      , (14, "quatorze")
+      , (15, "tchînze")
+      , (16, "seize")
+      , (17, "dgiêx-sept")
+      , (18, "dgiêx-huit")
+      , (19, "dgiêx-neuf")
+      , (20, "vîngt")
+      , (21, "vîngt’tch’ieune")
+      , (22, "vîngt-deux")
+      , (23, "vîngt-trais")
+      , (24, "vîngt-quat’")
+      , (25, "vîngt-chîn")
+      , (26, "vîngt-six")
+      , (27, "vîngt-sept")
+      , (28, "vîngt-huit")
+      , (29, "vîngt-neuf")
+      , (30, "trente")
+      , (31, "trente’tch’ieune")
+      , (32, "trente-deux")
+      , (33, "trente-trais")
+      , (34, "trente-quat’")
+      , (35, "trente-chîn")
+      , (36, "trente-six")
+      , (37, "trente-sept")
+      , (38, "trente-huit")
+      , (39, "trente-neuf")
+      , (40, "quarante")
+      , (41, "quarante’tch’ieune")
+      , (42, "quarante-deux")
+      , (43, "quarante-trais")
+      , (44, "quarante-quat’")
+      , (45, "quarante-chîn")
+      , (46, "quarante-six")
+      , (47, "quarante-sept")
+      , (48, "quarante-huit")
+      , (49, "quarante-neuf")
+      , (50, "chînquante")
+      , (51, "chînquante tch’ieune")
+      , (52, "chînquante-deux")
+      , (53, "chînquante-trais")
+      , (54, "chînquante-quat’")
+      , (55, "chînquante-chîn")
+      , (56, "chînquante-six")
+      , (57, "chînquante-sept")
+      , (58, "chînquante-huit")
+      , (59, "chînquante-neuf")
+      , (60, "souaixante")
+      , (61, "souaixante tch’ieune")
+      , (62, "souaixante-deux")
+      , (63, "souaixante-trais")
+      , (64, "souaixante-quat’")
+      , (65, "souaixante-chîn")
+      , (66, "souaixante-six")
+      , (67, "souaixante-sept")
+      , (68, "souaixante-huit")
+      , (69, "souaixante-neuf")
+      , (70, "septante")
+      , (71, "septante tch’ieune")
+      , (72, "septante-deux")
+      , (73, "septante-trais")
+      , (74, "septante-quat’")
+      , (75, "septante-chîn")
+      , (76, "septante-six")
+      , (77, "septante-sept")
+      , (78, "septante-huit")
+      , (79, "septante-neuf")
+      , (80, "quatre-vîngts")
+      , (81, "quatre-vîngt-ieune")
+      , (82, "quatre-vîngt-deux")
+      , (83, "quatre-vîngt-trais")
+      , (84, "quatre-vîngt-quat’")
+      , (85, "quatre-vîngt-chîn")
+      , (86, "quatre-vîngt-six")
+      , (87, "quatre-vîngt-sept")
+      , (88, "quatre-vîngt-huit")
+      , (89, "quatre-vîngt-neuf")
+      , (90, "nénante")
+      , (91, "nénante tch’ieune")
+      , (92, "nénante-deux")
+      , (93, "nénante-trais")
+      , (94, "nénante-quat’")
+      , (95, "nénante-chîn")
+      , (96, "nénante-six")
+      , (97, "nénante-sept")
+      , (98, "nénante-huit")
+      , (99, "nénante-neuf")
+      , (100, "chent")
+      , (101, "chent ieune")
+      , (102, "chent deux")
+      , (103, "chent trais")
+      , (104, "chent quat’")
+      , (105, "chent chîn")
+      , (106, "chent six")
+      , (107, "chent sept")
+      , (108, "chent huit")
+      , (109, "chent neuf")
+      , (110, "chent dgix")
+      , (123, "chent vîngt-trais")
+      , (200, "deux chents")
+      , (300, "trais chents")
+      , (321, "trais chents vîngt’tch’ieune")
+      , (400, "quat’ chents")
+      , (500, "chîn chents")
+      , (600, "siêx chents")
+      , (700, "sept chents")
+      , (800, "huit chents")
+      , (900, "neu chents")
+      , (909, "neu chents neuf")
+      , (990, "neu chents nénante")
+      , (999, "neu chents nénante-neuf")
+      , (1000, "mille")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/FRR/TestData.hs b/src-test/Text/Numeral/Language/FRR/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/FRR/TestData.hs
@@ -0,0 +1,196 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        frr
+
+[@ISO639-3@]        frr
+
+[@Native name@]     Frasch, Fresk, Freesk, Friisk
+
+[@English name@]    North Frisian
+-}
+module Text.Numeral.Language.FRR.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-north-frisian/en/frr/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "iinj")
+      , (2, "tou")
+      , (3, "tri")
+      , (4, "fjouer")
+      , (5, "fiiw")
+      , (6, "seeks")
+      , (7, "soowen")
+      , (8, "oocht")
+      , (9, "nüügen")
+      , (10, "tiin")
+      , (11, "alwen")
+      , (12, "tweelwen")
+      , (13, "tratäin")
+      , (14, "fjouertäin")
+      , (15, "füftäin")
+      , (16, "seekstäin")
+      , (17, "soowentäin")
+      , (18, "oochttäin")
+      , (19, "nüügentäin")
+      , (20, "twunti")
+      , (21, "iinjäntwunti")
+      , (22, "touäntwunti")
+      , (23, "triäntwunti")
+      , (24, "fjoueräntwunti")
+      , (25, "fiiwäntwunti")
+      , (26, "seeksäntwunti")
+      , (27, "soowenäntwunti")
+      , (28, "oochtäntwunti")
+      , (29, "nüügenäntwunti")
+      , (30, "dörti")
+      , (31, "iinjändörti")
+      , (32, "touändörti")
+      , (33, "triändörti")
+      , (34, "fjouerändörti")
+      , (35, "fiiwändörti")
+      , (36, "seeksändörti")
+      , (37, "soowenändörti")
+      , (38, "oochtändörti")
+      , (39, "nüügenändörti")
+      , (40, "fäärti")
+      , (41, "iinjänfäärti")
+      , (42, "touänfäärti")
+      , (43, "triänfäärti")
+      , (44, "fjoueränfäärti")
+      , (45, "fiiwänfäärti")
+      , (46, "seeksänfäärti")
+      , (47, "soowenänfäärti")
+      , (48, "oochtänfäärti")
+      , (49, "nüügenänfäärti")
+      , (50, "füfti")
+      , (51, "iinjänfüfti")
+      , (52, "touänfüfti")
+      , (53, "triänfüfti")
+      , (54, "fjoueränfüfti")
+      , (55, "fiiwänfüfti")
+      , (56, "seeksänfüfti")
+      , (57, "soowenänfüfti")
+      , (58, "oochtänfüfti")
+      , (59, "nüügenänfüfti")
+      , (60, "süsti")
+      , (61, "iinjänsüsti")
+      , (62, "touänsüsti")
+      , (63, "triänsüsti")
+      , (64, "fjoueränsüsti")
+      , (65, "fiiwänsüsti")
+      , (66, "seeksänsüsti")
+      , (67, "soowenänsüsti")
+      , (68, "oochtänsüsti")
+      , (69, "nüügenänsüsti")
+      , (70, "sööwenti")
+      , (71, "iinjänsööwenti")
+      , (72, "touänsööwenti")
+      , (73, "triänsööwenti")
+      , (74, "fjoueränsööwenti")
+      , (75, "fiiwänsööwenti")
+      , (76, "seeksänsööwenti")
+      , (77, "soowenänsööwenti")
+      , (78, "oochtänsööwenti")
+      , (79, "nüügenänsööwenti")
+      , (80, "tachenti")
+      , (81, "iinjäntachenti")
+      , (82, "touäntachenti")
+      , (83, "triäntachenti")
+      , (84, "fjoueräntachenti")
+      , (85, "fiiwäntachenti")
+      , (86, "seeksäntachenti")
+      , (87, "soowenäntachenti")
+      , (88, "oochtäntachenti")
+      , (89, "nüügenäntachenti")
+      , (90, "näägenti")
+      , (91, "iinjännäägenti")
+      , (92, "touännäägenti")
+      , (93, "triännäägenti")
+      , (94, "fjouerännäägenti")
+      , (95, "fiiwännäägenti")
+      , (96, "seeksännäägenti")
+      , (97, "soowenännäägenti")
+      , (98, "oochtännäägenti")
+      , (99, "nüügenännäägenti")
+      , (100, "hunert")
+      , (101, "hunert iinj")
+      , (102, "hunert tou")
+      , (103, "hunert tri")
+      , (104, "hunert fjouer")
+      , (105, "hunert fiiw")
+      , (106, "hunert seeks")
+      , (107, "hunert soowen")
+      , (108, "hunert oocht")
+      , (109, "hunert nüügen")
+      , (110, "hunert tiin")
+      , (123, "hunert triäntwunti")
+      , (200, "touhunert")
+      , (300, "trihunert")
+      , (321, "trihunert iinjäntwunti")
+      , (400, "fjouerhunert")
+      , (500, "fiiwhunert")
+      , (600, "seekshunert")
+      , (700, "soowenhunert")
+      , (800, "oochthunert")
+      , (900, "nüügenhunert")
+      , (909, "nüügenhunert nüügen")
+      , (990, "nüügenhunert näägenti")
+      , (999, "nüügenhunert nüügenännäägenti")
+      , (1000, "duusend")
+      , (1001, "duusend iinj")
+      , (1008, "duusend oocht")
+      , (1234, "duusend touhunert fjouerändörti")
+      , (2000, "touduusend")
+      , (3000, "triduusend")
+      , (4000, "fjouerduusend")
+      , (4321, "fjouerduusend trihunert iinjäntwunti")
+      , (5000, "fiiwduusend")
+      , (6000, "seeksduusend")
+      , (7000, "soowenduusend")
+      , (8000, "oochtduusend")
+      , (9000, "nüügenduusend")
+      , (10000, "tiinduusend")
+      , (12345, "tweelwen duusend trihunert fiiwänfäärti")
+      , (20000, "twunti duusend")
+      , (30000, "dörti duusend")
+      , (40000, "fäärti duusend")
+      , (50000, "füfti duusend")
+      , (54321, "fjoueränfüfti duusend trihunert iinjäntwunti")
+      , (60000, "süsti duusend")
+      , (70000, "sööwenti duusend")
+      , (80000, "tachenti duusend")
+      , (90000, "näägenti duusend")
+      , (100000, "hunertduusend")
+      , (123456, "hunert triäntwunti duusend fjouerhunert seeksänfüfti")
+      , (200000, "touhunertduusend")
+      , (300000, "trihunertduusend")
+      , (400000, "fjouerhunertduusend")
+      , (500000, "fiiwhunertduusend")
+      , (600000, "seekshunertduusend")
+      , (654321, "seekshunert fjoueränfüfti duusend trihunert iinjäntwunti")
+      , (700000, "soowenhunertduusend")
+      , (800000, "oochthunertduusend")
+      , (900000, "nüügenhunertduusend")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/FUR/TestData.hs b/src-test/Text/Numeral/Language/FUR/TestData.hs
--- a/src-test/Text/Numeral/Language/FUR/TestData.hs
+++ b/src-test/Text/Numeral/Language/FUR/TestData.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -23,10 +17,8 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
 import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "numerals" Text.Numeral.Misc ( dec )
 import "this" Text.Numeral.Test ( TestData )
 
@@ -37,7 +29,7 @@
 
 -- Sources:
 --   http://www.languagesandnumbers.com/how-to-count-in-friulian/en/fur/
-cardinals ∷ (Integral i) ⇒ TestData i
+cardinals :: (Integral i) => TestData i
 cardinals =
   [ ( "masculine"
     , masculine defaultInflection
@@ -180,20 +172,20 @@
       , (110010, "cent e dîs mil e dîs")
       , (123456, "cent e vincjetrê mil cuatricent e cincuantesîs")
       , (dec 6, "un milion")
-      , (2 ⋅ dec 6, "doi milions")
-      , (3 ⋅ dec 6, "trê milions")
-      , (10 ⋅ dec 6, "dîs milions")
+      , (2 * dec 6, "doi milions")
+      , (3 * dec 6, "trê milions")
+      , (10 * dec 6, "dîs milions")
       , (dec 9, "un miliart")
-      , (2 ⋅ dec 9, "doi miliarts")
-      , (3 ⋅ dec 9, "trê miliarts")
+      , (2 * dec 9, "doi miliarts")
+      , (3 * dec 9, "trê miliarts")
       ]
     )
   , ( "feminine"
     , feminine defaultInflection
     , [ (1, "une")
       , (2, "dôs")
-      , (2 ⋅ dec 6, "dôs milions")
-      , (2 ⋅ dec 9, "dôs miliarts")
+      , (2 * dec 6, "dôs milions")
+      , (2 * dec 9, "dôs miliarts")
       ]
     )
   ]
diff --git a/src-test/Text/Numeral/Language/GCF_MTQ/TestData.hs b/src-test/Text/Numeral/Language/GCF_MTQ/TestData.hs
--- a/src-test/Text/Numeral/Language/GCF_MTQ/TestData.hs
+++ b/src-test/Text/Numeral/Language/GCF_MTQ/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-antillean-creole-of-martinique/en/gcf-mtq/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/GIL/TestData.hs b/src-test/Text/Numeral/Language/GIL/TestData.hs
--- a/src-test/Text/Numeral/Language/GIL/TestData.hs
+++ b/src-test/Text/Numeral/Language/GIL/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-gilbertese/en/gil/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/GL/TestData.hs b/src-test/Text/Numeral/Language/GL/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/GL/TestData.hs
+++ /dev/null
@@ -1,235 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        gl
-
-[@ISO639-2@]        glg
-
-[@ISO639-3@]        glg
-
-[@Native name@]     Galego
-
-[@English name@]    Galician
--}
-module Text.Numeral.Language.GL.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-galician/en/glg/
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "cero")
-      , (1, "un")
-      , (2, "dous")
-      , (3, "tres")
-      , (4, "catro")
-      , (5, "cinco")
-      , (6, "seis")
-      , (7, "sete")
-      , (8, "oito")
-      , (9, "nove")
-      , (10, "dez")
-      , (11, "once")
-      , (12, "doce")
-      , (13, "trece")
-      , (14, "catorce")
-      , (15, "quince")
-      , (16, "dezaseis")
-      , (17, "dezasete")
-      , (18, "dezoito")
-      , (19, "dezanove")
-      , (20, "vinte")
-      , (21, "vinte e un")
-      , (22, "vinte e dous")
-      , (23, "vinte e tres")
-      , (24, "vinte e catro")
-      , (25, "vinte e cinco")
-      , (26, "vinte e seis")
-      , (27, "vinte e sete")
-      , (28, "vinte e oito")
-      , (29, "vinte e nove")
-      , (30, "trinta")
-      , (31, "trinta e un")
-      , (32, "trinta e dous")
-      , (33, "trinta e tres")
-      , (34, "trinta e catro")
-      , (35, "trinta e cinco")
-      , (36, "trinta e seis")
-      , (37, "trinta e sete")
-      , (38, "trinta e oito")
-      , (39, "trinta e nove")
-      , (40, "corenta")
-      , (41, "corenta e un")
-      , (42, "corenta e dous")
-      , (43, "corenta e tres")
-      , (44, "corenta e catro")
-      , (45, "corenta e cinco")
-      , (46, "corenta e seis")
-      , (47, "corenta e sete")
-      , (48, "corenta e oito")
-      , (49, "corenta e nove")
-      , (50, "cincuenta")
-      , (51, "cincuenta e un")
-      , (52, "cincuenta e dous")
-      , (53, "cincuenta e tres")
-      , (54, "cincuenta e catro")
-      , (55, "cincuenta e cinco")
-      , (56, "cincuenta e seis")
-      , (57, "cincuenta e sete")
-      , (58, "cincuenta e oito")
-      , (59, "cincuenta e nove")
-      , (60, "sesenta")
-      , (61, "sesenta e un")
-      , (62, "sesenta e dous")
-      , (63, "sesenta e tres")
-      , (64, "sesenta e catro")
-      , (65, "sesenta e cinco")
-      , (66, "sesenta e seis")
-      , (67, "sesenta e sete")
-      , (68, "sesenta e oito")
-      , (69, "sesenta e nove")
-      , (70, "setenta")
-      , (71, "setenta e un")
-      , (72, "setenta e dous")
-      , (73, "setenta e tres")
-      , (74, "setenta e catro")
-      , (75, "setenta e cinco")
-      , (76, "setenta e seis")
-      , (77, "setenta e sete")
-      , (78, "setenta e oito")
-      , (79, "setenta e nove")
-      , (80, "oitenta")
-      , (81, "oitenta e un")
-      , (82, "oitenta e dous")
-      , (83, "oitenta e tres")
-      , (84, "oitenta e catro")
-      , (85, "oitenta e cinco")
-      , (86, "oitenta e seis")
-      , (87, "oitenta e sete")
-      , (88, "oitenta e oito")
-      , (89, "oitenta e nove")
-      , (90, "noventa")
-      , (91, "noventa e un")
-      , (92, "noventa e dous")
-      , (93, "noventa e tres")
-      , (94, "noventa e catro")
-      , (95, "noventa e cinco")
-      , (96, "noventa e seis")
-      , (97, "noventa e sete")
-      , (98, "noventa e oito")
-      , (99, "noventa e nove")
-      , (100, "cen")
-      , (101, "cento un")
-      , (102, "cento dous")
-      , (103, "cento tres")
-      , (104, "cento catro")
-      , (105, "cento cinco")
-      , (106, "cento seis")
-      , (107, "cento sete")
-      , (108, "cento oito")
-      , (109, "cento nove")
-      , (110, "cento dez")
-      , (123, "cento vinte e tres")
-      , (200, "douscentos")
-      , (300, "trescentos")
-      , (321, "trescentos e vinte e un")
-      , (400, "catrocentos")
-      , (500, "cincocentos")
-      , (600, "seiscentos")
-      , (700, "setecentos")
-      , (800, "oitocentos")
-      , (900, "novecentos")
-      , (909, "novecentos e nove")
-      , (990, "novecentos e noventa")
-      , (999, "novecentos e noventa e nove")
-      , (1000, "mil")
-      , (1001, "mil e un")
-      , (1008, "mil e oito")
-      , (1234, "mil douscentos e trinta e catro")
-      , (2000, "dous mil")
-      , (3000, "tres mil")
-      , (4000, "catro mil")
-      , (4321, "catro mil trescentos e vinte e un")
-      , (5000, "cinco mil")
-      , (6000, "seis mil")
-      , (7000, "sete mil")
-      , (8000, "oito mil")
-      , (9000, "nove mil")
-      , (10000, "dez mil")
-      , (12345, "doce mil trescentos e corenta e cinco")
-      , (20000, "vinte mil")
-      , (30000, "trinta mil")
-      , (40000, "corenta mil")
-      , (50000, "cincuenta mil")
-      , (54321, "cincuenta e catro mil trescentos e vinte e un")
-      , (60000, "sesenta mil")
-      , (70000, "setenta mil")
-      , (80000, "oitenta mil")
-      , (90000, "noventa mil")
-      , (100000, "cen mil")
-      , (123456, "cento vinte e tres mil catrocentos e cincuenta e seis")
-      , (200000, "douscentos mil")
-      , (300000, "trescentos mil")
-      , (400000, "catrocentos mil")
-      , (500000, "cincocentos mil")
-      , (600000, "seiscentos mil")
-      , (654321, "seiscentos e cincuenta e catro mil trescentos e vinte e un")
-      , (700000, "setecentos mil")
-      , (800000, "oitocentos mil")
-      , (900000, "novecentos mil")
-      , (1000000, "un milhom")
-      , (1000001, "un milhom e un")
-      , (1234567, "un milhom douscentos e trinta e catro mil cincocentos e sesenta e sete")
-      , (2000000, "dous milhom")
-      , (3000000, "tres milhom")
-      , (4000000, "catro milhom")
-      , (5000000, "cinco milhom")
-      , (6000000, "seis milhom")
-      , (7000000, "sete milhom")
-      , (7654321, "sete milhom seiscentos e cincuenta e catro mil trescentos e vinte e un")
-      , (8000000, "oito milhom")
-      , (9000000, "nove milhom")
-      , (1000000000, "un bilhom")
-      , (1000000001, "un bilhom e un")
-      , (2000000000, "dous bilhom")
-      , (3000000000, "tres bilhom")
-      , (4000000000, "catro bilhom")
-      , (5000000000, "cinco bilhom")
-      , (6000000000, "seis bilhom")
-      , (7000000000, "sete bilhom")
-      , (8000000000, "oito bilhom")
-      , (9000000000, "nove bilhom")
-      , (1000000000000, "un trilhom")
-      , (1000000000001, "un trilhom e un")
-      , (2000000000000, "dous trilhom")
-      , (3000000000000, "tres trilhom")
-      , (4000000000000, "catro trilhom")
-      , (5000000000000, "cinco trilhom")
-      , (6000000000000, "seis trilhom")
-      , (7000000000000, "sete trilhom")
-      , (8000000000000, "oito trilhom")
-      , (9000000000000, "nove trilhom")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/GLG/TestData.hs b/src-test/Text/Numeral/Language/GLG/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/GLG/TestData.hs
@@ -0,0 +1,229 @@
+{-|
+[@ISO639-1@]        gl
+
+[@ISO639-2@]        glg
+
+[@ISO639-3@]        glg
+
+[@Native name@]     Galego
+
+[@English name@]    Galician
+-}
+module Text.Numeral.Language.GLG.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-galician/en/glg/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "cero")
+      , (1, "un")
+      , (2, "dous")
+      , (3, "tres")
+      , (4, "catro")
+      , (5, "cinco")
+      , (6, "seis")
+      , (7, "sete")
+      , (8, "oito")
+      , (9, "nove")
+      , (10, "dez")
+      , (11, "once")
+      , (12, "doce")
+      , (13, "trece")
+      , (14, "catorce")
+      , (15, "quince")
+      , (16, "dezaseis")
+      , (17, "dezasete")
+      , (18, "dezoito")
+      , (19, "dezanove")
+      , (20, "vinte")
+      , (21, "vinte e un")
+      , (22, "vinte e dous")
+      , (23, "vinte e tres")
+      , (24, "vinte e catro")
+      , (25, "vinte e cinco")
+      , (26, "vinte e seis")
+      , (27, "vinte e sete")
+      , (28, "vinte e oito")
+      , (29, "vinte e nove")
+      , (30, "trinta")
+      , (31, "trinta e un")
+      , (32, "trinta e dous")
+      , (33, "trinta e tres")
+      , (34, "trinta e catro")
+      , (35, "trinta e cinco")
+      , (36, "trinta e seis")
+      , (37, "trinta e sete")
+      , (38, "trinta e oito")
+      , (39, "trinta e nove")
+      , (40, "corenta")
+      , (41, "corenta e un")
+      , (42, "corenta e dous")
+      , (43, "corenta e tres")
+      , (44, "corenta e catro")
+      , (45, "corenta e cinco")
+      , (46, "corenta e seis")
+      , (47, "corenta e sete")
+      , (48, "corenta e oito")
+      , (49, "corenta e nove")
+      , (50, "cincuenta")
+      , (51, "cincuenta e un")
+      , (52, "cincuenta e dous")
+      , (53, "cincuenta e tres")
+      , (54, "cincuenta e catro")
+      , (55, "cincuenta e cinco")
+      , (56, "cincuenta e seis")
+      , (57, "cincuenta e sete")
+      , (58, "cincuenta e oito")
+      , (59, "cincuenta e nove")
+      , (60, "sesenta")
+      , (61, "sesenta e un")
+      , (62, "sesenta e dous")
+      , (63, "sesenta e tres")
+      , (64, "sesenta e catro")
+      , (65, "sesenta e cinco")
+      , (66, "sesenta e seis")
+      , (67, "sesenta e sete")
+      , (68, "sesenta e oito")
+      , (69, "sesenta e nove")
+      , (70, "setenta")
+      , (71, "setenta e un")
+      , (72, "setenta e dous")
+      , (73, "setenta e tres")
+      , (74, "setenta e catro")
+      , (75, "setenta e cinco")
+      , (76, "setenta e seis")
+      , (77, "setenta e sete")
+      , (78, "setenta e oito")
+      , (79, "setenta e nove")
+      , (80, "oitenta")
+      , (81, "oitenta e un")
+      , (82, "oitenta e dous")
+      , (83, "oitenta e tres")
+      , (84, "oitenta e catro")
+      , (85, "oitenta e cinco")
+      , (86, "oitenta e seis")
+      , (87, "oitenta e sete")
+      , (88, "oitenta e oito")
+      , (89, "oitenta e nove")
+      , (90, "noventa")
+      , (91, "noventa e un")
+      , (92, "noventa e dous")
+      , (93, "noventa e tres")
+      , (94, "noventa e catro")
+      , (95, "noventa e cinco")
+      , (96, "noventa e seis")
+      , (97, "noventa e sete")
+      , (98, "noventa e oito")
+      , (99, "noventa e nove")
+      , (100, "cen")
+      , (101, "cento un")
+      , (102, "cento dous")
+      , (103, "cento tres")
+      , (104, "cento catro")
+      , (105, "cento cinco")
+      , (106, "cento seis")
+      , (107, "cento sete")
+      , (108, "cento oito")
+      , (109, "cento nove")
+      , (110, "cento dez")
+      , (123, "cento vinte e tres")
+      , (200, "douscentos")
+      , (300, "trescentos")
+      , (321, "trescentos e vinte e un")
+      , (400, "catrocentos")
+      , (500, "cincocentos")
+      , (600, "seiscentos")
+      , (700, "setecentos")
+      , (800, "oitocentos")
+      , (900, "novecentos")
+      , (909, "novecentos e nove")
+      , (990, "novecentos e noventa")
+      , (999, "novecentos e noventa e nove")
+      , (1000, "mil")
+      , (1001, "mil e un")
+      , (1008, "mil e oito")
+      , (1234, "mil douscentos e trinta e catro")
+      , (2000, "dous mil")
+      , (3000, "tres mil")
+      , (4000, "catro mil")
+      , (4321, "catro mil trescentos e vinte e un")
+      , (5000, "cinco mil")
+      , (6000, "seis mil")
+      , (7000, "sete mil")
+      , (8000, "oito mil")
+      , (9000, "nove mil")
+      , (10000, "dez mil")
+      , (12345, "doce mil trescentos e corenta e cinco")
+      , (20000, "vinte mil")
+      , (30000, "trinta mil")
+      , (40000, "corenta mil")
+      , (50000, "cincuenta mil")
+      , (54321, "cincuenta e catro mil trescentos e vinte e un")
+      , (60000, "sesenta mil")
+      , (70000, "setenta mil")
+      , (80000, "oitenta mil")
+      , (90000, "noventa mil")
+      , (100000, "cen mil")
+      , (123456, "cento vinte e tres mil catrocentos e cincuenta e seis")
+      , (200000, "douscentos mil")
+      , (300000, "trescentos mil")
+      , (400000, "catrocentos mil")
+      , (500000, "cincocentos mil")
+      , (600000, "seiscentos mil")
+      , (654321, "seiscentos e cincuenta e catro mil trescentos e vinte e un")
+      , (700000, "setecentos mil")
+      , (800000, "oitocentos mil")
+      , (900000, "novecentos mil")
+      , (1000000, "un milhom")
+      , (1000001, "un milhom e un")
+      , (1234567, "un milhom douscentos e trinta e catro mil cincocentos e sesenta e sete")
+      , (2000000, "dous milhom")
+      , (3000000, "tres milhom")
+      , (4000000, "catro milhom")
+      , (5000000, "cinco milhom")
+      , (6000000, "seis milhom")
+      , (7000000, "sete milhom")
+      , (7654321, "sete milhom seiscentos e cincuenta e catro mil trescentos e vinte e un")
+      , (8000000, "oito milhom")
+      , (9000000, "nove milhom")
+      , (1000000000, "un bilhom")
+      , (1000000001, "un bilhom e un")
+      , (2000000000, "dous bilhom")
+      , (3000000000, "tres bilhom")
+      , (4000000000, "catro bilhom")
+      , (5000000000, "cinco bilhom")
+      , (6000000000, "seis bilhom")
+      , (7000000000, "sete bilhom")
+      , (8000000000, "oito bilhom")
+      , (9000000000, "nove bilhom")
+      , (1000000000000, "un trilhom")
+      , (1000000000001, "un trilhom e un")
+      , (2000000000000, "dous trilhom")
+      , (3000000000000, "tres trilhom")
+      , (4000000000000, "catro trilhom")
+      , (5000000000000, "cinco trilhom")
+      , (6000000000000, "seis trilhom")
+      , (7000000000000, "sete trilhom")
+      , (8000000000000, "oito trilhom")
+      , (9000000000000, "nove trilhom")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/GLV/TestData.hs b/src-test/Text/Numeral/Language/GLV/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/GLV/TestData.hs
@@ -0,0 +1,151 @@
+{-|
+[@ISO639-1@]        gv
+
+[@ISO639-2@]        glv
+
+[@ISO639-3@]        glv
+
+[@Native name@]     Gaelg
+
+[@English name@]    Manx
+-}
+
+module Text.Numeral.Language.GLV.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.sf.airnet.ne.jp/~ts/language/number/manx.html
+  http://www.gaelg.iofm.net/LESSONS/P/P19.html
+  http://www.gaelg.iofm.net/LESSONS/mona/Lessons.pdf
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "nane")
+      , (2, "jees")
+      , (3, "tree")
+      , (4, "kiare")
+      , (5, "queig")
+      , (6, "shey")
+      , (7, "shiaght")
+      , (8, "hoght")
+      , (9, "nuy")
+      , (10, "jeih")
+      , (11, "nane-jeig")
+      , (12, "daa-yeig")
+      , (13, "tree-jeig")
+      , (14, "kiare-jeig")
+      , (15, "queig-jeig")
+      , (16, "shey-jeig")
+      , (17, "shiaght-jeig")
+      , (18, "hoght-jeig")
+      , (19, "nuy-jeig")
+      , (20, "feed")
+      , (21, "nane as feed")
+      , (22, "jees as feed")
+      , (23, "tree as feed")
+      , (24, "kiare as feed")
+      , (25, "queig as feed")
+      , (26, "shey as feed")
+      , (27, "shiaght as feed")
+      , (28, "hoght as feed")
+      , (29, "nuy as feed")
+      , (30, "jeih as feed")
+      , (31, "nane-jeig as feed")
+      , (32, "daa-yeig as feed")
+      , (33, "tree-jeig as feed")
+      , (34, "kiare-jeig as feed")
+      , (35, "queig-jeig as feed")
+      , (36, "shey-jeig as feed")
+      , (37, "shiaght-jeig as feed")
+      , (38, "hoght-jeig as feed")
+      , (39, "nuy-jeig as feed")
+      , (40, "daeed")
+      , (41, "nane as daeed")
+      , (42, "jees as daeed")
+      , (43, "tree as daeed")
+      , (44, "kiare as daeed")
+      , (45, "queig as daeed")
+      , (46, "shey as daeed")
+      , (47, "shiaght as daeed")
+      , (48, "hoght as daeed")
+      , (49, "nuy as daeed")
+      , (50, "jeih as daeed")
+      , (51, "nane-jeig as daeed")
+      , (52, "daa-yeig as daeed")
+      , (53, "tree-jeig as daeed")
+      , (54, "kiare-jeig as daeed")
+      , (55, "queig-jeig as daeed")
+      , (56, "shey-jeig as daeed")
+      , (57, "shiaght-jeig as daeed")
+      , (58, "hoght-jeig as daeed")
+      , (59, "nuy-jeig as daeed")
+      , (60, "tree feed")
+      , (61, "tree feed as nane")
+      , (62, "tree feed as jees")
+      , (63, "tree feed as tree")
+      , (64, "tree feed as kiare")
+      , (65, "tree feed as queig")
+      , (66, "tree feed as shey")
+      , (67, "tree feed as shiaght")
+      , (68, "tree feed as hoght")
+      , (69, "tree feed as nuy")
+      , (70, "tree feed as jeih")
+      , (71, "tree feed as nane-jeig")
+      , (72, "tree feed as daa-yeig")
+      , (73, "tree feed as tree-jeig")
+      , (74, "tree feed as kiare-jeig")
+      , (75, "tree feed as queig-jeig")
+      , (76, "tree feed as shey-jeig")
+      , (77, "tree feed as shiaght-jeig")
+      , (78, "tree feed as hoght-jeig")
+      , (79, "tree feed as nuy-jeig")
+      , (80, "kiare feed")
+      , (81, "kiare feed as nane")
+      , (82, "kiare feed as jees")
+      , (83, "kiare feed as tree")
+      , (84, "kiare feed as kiare")
+      , (85, "kiare feed as queig")
+      , (86, "kiare feed as shey")
+      , (87, "kiare feed as shiaght")
+      , (88, "kiare feed as hoght")
+      , (89, "kiare feed as nuy")
+      , (90, "kiare feed as jeih")
+      , (91, "kiare feed as nane-jeig")
+      , (92, "kiare feed as daa-yeig")
+      , (93, "kiare feed as tree-jeig")
+      , (94, "kiare feed as kiare-jeig")
+      , (95, "kiare feed as queig-jeig")
+      , (96, "kiare feed as shey-jeig")
+      , (97, "kiare feed as shiaght-jeig")
+      , (98, "kiare feed as hoght-jeig")
+      , (99, "kiare feed as nuy-jeig")
+      , (100, "keead")
+      , (200, "daa cheead")
+      , (300, "tree cheead")
+      , (400, "kiare cheead")
+      , (500, "queig cheead")
+      , (600, "shey cheead")
+      , (700, "shiaght cheead")
+      , (800, "hoght cheead")
+      , (900, "nuy cheead")
+      , (1000, "thousane")
+      -- , (dec 6, "jeih cheead thousane")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/GSW/TestData.hs b/src-test/Text/Numeral/Language/GSW/TestData.hs
--- a/src-test/Text/Numeral/Language/GSW/TestData.hs
+++ b/src-test/Text/Numeral/Language/GSW/TestData.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -23,8 +17,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -37,7 +30,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-swiss-german/en/gsw-che/
 -}
 
-cardinals ∷ (Integral i) ⇒ TestData i
+cardinals :: (Integral i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/GV/TestData.hs b/src-test/Text/Numeral/Language/GV/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/GV/TestData.hs
+++ /dev/null
@@ -1,158 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        gv
-
-[@ISO639-2@]        glv
-
-[@ISO639-3@]        glv
-
-[@Native name@]     Gaelg
-
-[@English name@]    Manx
--}
-
-module Text.Numeral.Language.GV.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.sf.airnet.ne.jp/~ts/language/number/manx.html
-  http://www.gaelg.iofm.net/LESSONS/P/P19.html
-  http://www.gaelg.iofm.net/LESSONS/mona/Lessons.pdf
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "nane")
-      , (2, "jees")
-      , (3, "tree")
-      , (4, "kiare")
-      , (5, "queig")
-      , (6, "shey")
-      , (7, "shiaght")
-      , (8, "hoght")
-      , (9, "nuy")
-      , (10, "jeih")
-      , (11, "nane-jeig")
-      , (12, "daa-yeig")
-      , (13, "tree-jeig")
-      , (14, "kiare-jeig")
-      , (15, "queig-jeig")
-      , (16, "shey-jeig")
-      , (17, "shiaght-jeig")
-      , (18, "hoght-jeig")
-      , (19, "nuy-jeig")
-      , (20, "feed")
-      , (21, "nane as feed")
-      , (22, "jees as feed")
-      , (23, "tree as feed")
-      , (24, "kiare as feed")
-      , (25, "queig as feed")
-      , (26, "shey as feed")
-      , (27, "shiaght as feed")
-      , (28, "hoght as feed")
-      , (29, "nuy as feed")
-      , (30, "jeih as feed")
-      , (31, "nane-jeig as feed")
-      , (32, "daa-yeig as feed")
-      , (33, "tree-jeig as feed")
-      , (34, "kiare-jeig as feed")
-      , (35, "queig-jeig as feed")
-      , (36, "shey-jeig as feed")
-      , (37, "shiaght-jeig as feed")
-      , (38, "hoght-jeig as feed")
-      , (39, "nuy-jeig as feed")
-      , (40, "daeed")
-      , (41, "nane as daeed")
-      , (42, "jees as daeed")
-      , (43, "tree as daeed")
-      , (44, "kiare as daeed")
-      , (45, "queig as daeed")
-      , (46, "shey as daeed")
-      , (47, "shiaght as daeed")
-      , (48, "hoght as daeed")
-      , (49, "nuy as daeed")
-      , (50, "jeih as daeed")
-      , (51, "nane-jeig as daeed")
-      , (52, "daa-yeig as daeed")
-      , (53, "tree-jeig as daeed")
-      , (54, "kiare-jeig as daeed")
-      , (55, "queig-jeig as daeed")
-      , (56, "shey-jeig as daeed")
-      , (57, "shiaght-jeig as daeed")
-      , (58, "hoght-jeig as daeed")
-      , (59, "nuy-jeig as daeed")
-      , (60, "tree feed")
-      , (61, "tree feed as nane")
-      , (62, "tree feed as jees")
-      , (63, "tree feed as tree")
-      , (64, "tree feed as kiare")
-      , (65, "tree feed as queig")
-      , (66, "tree feed as shey")
-      , (67, "tree feed as shiaght")
-      , (68, "tree feed as hoght")
-      , (69, "tree feed as nuy")
-      , (70, "tree feed as jeih")
-      , (71, "tree feed as nane-jeig")
-      , (72, "tree feed as daa-yeig")
-      , (73, "tree feed as tree-jeig")
-      , (74, "tree feed as kiare-jeig")
-      , (75, "tree feed as queig-jeig")
-      , (76, "tree feed as shey-jeig")
-      , (77, "tree feed as shiaght-jeig")
-      , (78, "tree feed as hoght-jeig")
-      , (79, "tree feed as nuy-jeig")
-      , (80, "kiare feed")
-      , (81, "kiare feed as nane")
-      , (82, "kiare feed as jees")
-      , (83, "kiare feed as tree")
-      , (84, "kiare feed as kiare")
-      , (85, "kiare feed as queig")
-      , (86, "kiare feed as shey")
-      , (87, "kiare feed as shiaght")
-      , (88, "kiare feed as hoght")
-      , (89, "kiare feed as nuy")
-      , (90, "kiare feed as jeih")
-      , (91, "kiare feed as nane-jeig")
-      , (92, "kiare feed as daa-yeig")
-      , (93, "kiare feed as tree-jeig")
-      , (94, "kiare feed as kiare-jeig")
-      , (95, "kiare feed as queig-jeig")
-      , (96, "kiare feed as shey-jeig")
-      , (97, "kiare feed as shiaght-jeig")
-      , (98, "kiare feed as hoght-jeig")
-      , (99, "kiare feed as nuy-jeig")
-      , (100, "keead")
-      , (200, "daa cheead")
-      , (300, "tree cheead")
-      , (400, "kiare cheead")
-      , (500, "queig cheead")
-      , (600, "shey cheead")
-      , (700, "shiaght cheead")
-      , (800, "hoght cheead")
-      , (900, "nuy cheead")
-      , (1000, "thousane")
-      -- , (dec 6, "jeih cheead thousane")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/HAI/TestData.hs b/src-test/Text/Numeral/Language/HAI/TestData.hs
--- a/src-test/Text/Numeral/Language/HAI/TestData.hs
+++ b/src-test/Text/Numeral/Language/HAI/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -39,7 +33,7 @@
 'waak' means 'add on'
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
@@ -159,7 +153,7 @@
       , (321, "lagwa uu tláahl wáak lagwa uu tléihl lagwa uu sgwáansang wáak sgwáansang")
       , (400, "lagwa uu tlaalee sdáng")
       , (500, "lagwa uu tlaalee sdáng wáak lagwa uu tléihl")
-      , (600, "lagwa uu tlaalee tléihl")
+      , (600, "lagwa uu tlaalee hlgúnahl")
       , (700, "lagwa uu tlaalee wáak lagwa uu tléihl")
       , (800, "lagwa uu tlaalee sdáansaangaa")
       , (900, "lagwa uu tlaalee sdáansaangaa wáak lagwa uu tléihl")
diff --git a/src-test/Text/Numeral/Language/HAT/TestData.hs b/src-test/Text/Numeral/Language/HAT/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/HAT/TestData.hs
@@ -0,0 +1,219 @@
+{-|
+[@ISO639-1@]        ht
+
+[@ISO639-2@]        hat
+
+[@ISO639-3@]        hat
+
+[@Native name@]     -
+
+[@English name@]    Haitian Creole
+-}
+module Text.Numeral.Language.HAT.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-haitian-creole/en/hat/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "zero")
+      , (1, "youn")
+      , (2, "de")
+      , (3, "twa")
+      , (4, "kat")
+      , (5, "senk")
+      , (6, "sis")
+      , (7, "sèt")
+      , (8, "uit")
+      , (9, "nèf")
+      , (10, "dis")
+      , (11, "onz")
+      , (12, "douz")
+      , (13, "trèz")
+      , (14, "katòz")
+      , (15, "kenz")
+      , (16, "sèz")
+      , (17, "disèt")
+      , (18, "dizuit")
+      , (19, "diznèf")
+      , (20, "ven")
+      , (21, "venteyen")
+      , (22, "vennde")
+      , (23, "venntwa")
+      , (24, "vennkat")
+      , (25, "vennsenk")
+      , (26, "vennsis")
+      , (27, "vennsèt")
+      , (28, "ventuit")
+      , (29, "ventnèf")
+      , (30, "trant")
+      , (31, "tranteyen")
+      , (32, "trannde")
+      , (33, "tranntwa")
+      , (34, "trannkat")
+      , (35, "trannsenk")
+      , (36, "trannsis")
+      , (37, "trannsèt")
+      , (38, "trantuit")
+      , (39, "trantnèf")
+      , (40, "karant")
+      , (41, "karanteyen")
+      , (42, "karannde")
+      , (43, "karanntwa")
+      , (44, "karannkat")
+      , (45, "karannsenk")
+      , (46, "karannsis")
+      , (47, "karannsèt")
+      , (48, "karantuit")
+      , (49, "karantnèf")
+      , (50, "senkant")
+      , (51, "senkanteyen")
+      , (52, "senkannde")
+      , (53, "senkanntwa")
+      , (54, "senkannkat")
+      , (55, "senkannsenk")
+      , (56, "senkannsis")
+      , (57, "senkannsèt")
+      , (58, "senkantuit")
+      , (59, "senkantnèf")
+      , (60, "swasann")
+      , (61, "swasannyoun")
+      , (62, "swasannde")
+      , (63, "swasanntwa")
+      , (64, "swasannkat")
+      , (65, "swasannsenk")
+      , (66, "swasannsis")
+      , (67, "swasannsèt")
+      , (68, "swasannuit")
+      , (69, "swasannnèf")
+      , (70, "swasanndis")
+      , (71, "swasannonz")
+      , (72, "swasanndisde")
+      , (73, "swasanntrèz")
+      , (74, "swasannkatòz")
+      , (75, "swasannkenz")
+      , (76, "swasannsèz")
+      , (77, "swasanndissèt")
+      , (78, "swasanndizuit")
+      , (79, "swasanndiznèf")
+      , (80, "katreven")
+      , (81, "katreventeyen")
+      , (82, "katrevennde")
+      , (83, "katrevenntwa")
+      , (84, "katrevennkat")
+      , (85, "katrevennsenk")
+      , (86, "katrevennsis")
+      , (87, "katrevennsèt")
+      , (88, "katreventuit")
+      , (89, "katreventnèf")
+      , (90, "katrevendis")
+      , (91, "katrevenonz")
+      , (92, "katrevendisde")
+      , (93, "katreventrèz")
+      , (94, "katrevenkatòz")
+      , (95, "katrevenkenz")
+      , (96, "katrevensèz")
+      , (97, "katrevendissèt")
+      , (98, "katrevendizuit")
+      , (99, "katrevendiznèf")
+      , (100, "san")
+      , (101, "san en")
+      , (102, "san de")
+      , (103, "san twa")
+      , (104, "san kat")
+      , (105, "san senk")
+      , (106, "san sis")
+      , (107, "san sèt")
+      , (108, "san uit")
+      , (109, "san nèf")
+      , (110, "san dis")
+      , (123, "san venntwa")
+      , (200, "de san")
+      , (300, "twa san")
+      , (321, "twa san venteyen")
+      , (400, "kat san")
+      , (500, "sen san")
+      , (600, "si san")
+      , (700, "sèt san")
+      , (800, "ui san")
+      , (900, "nèf san")
+      , (909, "nèf san nèf")
+      , (990, "nèf san katrevendis")
+      , (999, "nèf san katrevendiznèf")
+      , (1000, "mil")
+      , (1001, "mil youn")
+      , (1008, "mil uit")
+      , (1234, "mil de san trannkat")
+      , (2000, "de mil")
+      , (3000, "twa mil")
+      , (4000, "kat mil")
+      , (4321, "kat mil twa san venteyen")
+      , (5000, "senk mil")
+      , (6000, "sis mil")
+      , (7000, "sèt mil")
+      , (8000, "uit mil")
+      , (9000, "nèf mil")
+      , (10000, "di mil")
+      , (12345, "douz mil twa san karannsenk")
+      , (20000, "ven mil")
+      , (30000, "trant mil")
+      , (40000, "karant mil")
+      , (50000, "senkant mil")
+      , (54321, "senkannkat mil twa san venteyen")
+      , (60000, "swasann mil")
+      , (70000, "swasanndi mil")
+      , (80000, "katreven mil")
+      , (90000, "katrevendi mil")
+      , (100000, "san mil")
+      , (123456, "san venntwa mil kat san senkannsis")
+      , (200000, "de san mil")
+      , (300000, "twa san mil")
+      , (400000, "kat san mil")
+      , (500000, "sen san mil")
+      , (600000, "si san mil")
+      , (654321, "si san senkannkat mil twa san venteyen")
+      , (700000, "sèt san mil")
+      , (800000, "ui san mil")
+      , (900000, "nèf san mil")
+      , (1000000, "yon milyon")
+      , (1000001, "yon milyon youn")
+      , (1234567, "yon milyon de san trannkat mil sen san swasannsèt")
+      , (2000000, "de milyon")
+      , (3000000, "twa milyon")
+      , (4000000, "kat milyon")
+      , (5000000, "senk milyon")
+      , (6000000, "sis milyon")
+      , (7000000, "sèt milyon")
+      , (7654321, "sèt milyon si san senkannkat mil twa san venteyen")
+      , (8000000, "uit milyon")
+      , (9000000, "nèf milyon")
+      , (1000000000, "yon milya")
+      , (1000000001, "yon milya youn")
+      , (2000000000, "de milya")
+      , (3000000000, "twa milya")
+      , (4000000000, "kat milya")
+      , (5000000000, "senk milya")
+      , (6000000000, "sis milya")
+      , (7000000000, "sèt milya")
+      , (8000000000, "uit milya")
+      , (9000000000, "nèf milya")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/HE/TestData.hs b/src-test/Text/Numeral/Language/HE/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/HE/TestData.hs
+++ /dev/null
@@ -1,315 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        he
-
-[@ISO639-2@]        heb
-
-[@ISO639-3@]        heb
-
-[@Native name@]     עִבְרִית
-
-[@English name@]    Modern Hebrew
--}
-
-module Text.Numeral.Language.HE.TestData
-  ( cardinals
-  ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  E-mail by Yitzchak Gale.
-  http://www.hebrew4christians.com/Grammar/Unit_Eight/Cardinal_Numbers/cardinal_numbers.html
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "feminine"
-    , feminine defaultInflection
-    , [ (0, "אפס")
-      , (1, "אחת")
-      , (2, "שתיים") -- Connecting form: "שתי"
-      , (3, "שלוש")
-      , (4, "ארבע")
-      , (5, "חמש")
-      , (6, "שש")
-      , (7, "שבע")
-      , (8, "שמונה")
-      , (9, "תשע")
-      , (10, "עשר")
-      , (11, "אחת עשרה")
-      , (12, "שתים עשרה")
-      , (13, "שלוש עשרה")
-      , (14, "ארבע עשרה")
-      , (15, "חמש עשרה")
-      , (16, "שש עשרה")
-      , (17, "שבע עשרה")
-      , (18, "שמונה עשרה")
-      , (19, "תשע עשרה")
-      , (20, "עשרים")
-      , (21, "עשרים ואחת")
-      , (22, "עשרים ושתיים")
-      , (23, "עשרים ושלוש")
-      , (24, "עשרים וארבע")
-      , (25, "עשרים וחמש")
-      , (26, "עשרים ושש")
-      , (27, "עשרים ושבע")
-      , (28, "עשרים ושמונה")
-      , (29, "עשרים ותשע")
-      , (30, "שלושים")
-      , (31, "שלושים ואחת")
-      , (32, "שלושים ושתיים")
-      , (33, "שלושים ושלוש")
-      , (34, "שלושים וארבע")
-      , (35, "שלושים וחמש")
-      , (36, "שלושים ושש")
-      , (37, "שלושים ושבע")
-      , (38, "שלושים ושמונה")
-      , (39, "שלושים ותשע")
-      , (40, "ארבעים")
-      , (41, "ארבעים ואחת")
-      , (42, "ארבעים ושתיים")
-      , (43, "ארבעים ושלוש")
-      , (44, "ארבעים וארבע")
-      , (45, "ארבעים וחמש")
-      , (46, "ארבעים ושש")
-      , (47, "ארבעים ושבע")
-      , (48, "ארבעים ושמונה")
-      , (49, "ארבעים ותשע")
-      , (50, "חמישים")
-      , (51, "חמישים ואחת")
-      , (52, "חמישים ושתיים")
-      , (53, "חמישים ושלוש")
-      , (54, "חמישים וארבע")
-      , (55, "חמישים וחמש")
-      , (56, "חמישים ושש")
-      , (57, "חמישים ושבע")
-      , (58, "חמישים ושמונה")
-      , (59, "חמישים ותשע")
-      , (60, "ששים")
-      , (61, "ששים ואחת")
-      , (62, "ששים ושתיים")
-      , (63, "ששים ושלוש")
-      , (64, "ששים וארבע")
-      , (65, "ששים וחמש")
-      , (66, "ששים ושש")
-      , (67, "ששים ושבע")
-      , (68, "ששים ושמונה")
-      , (69, "ששים ותשע")
-      , (70, "שבעים")
-      , (71, "שבעים ואחת")
-      , (72, "שבעים ושתיים")
-      , (73, "שבעים ושלוש")
-      , (74, "שבעים וארבע")
-      , (75, "שבעים וחמש")
-      , (76, "שבעים ושש")
-      , (77, "שבעים ושבע")
-      , (78, "שבעים ושמונה")
-      , (79, "שבעים ותשע")
-      , (80, "שמונים")
-      , (81, "שמונים ואחת")
-      , (82, "שמונים ושתיים")
-      , (83, "שמונים ושלוש")
-      , (84, "שמונים וארבע")
-      , (85, "שמונים וחמש")
-      , (86, "שמונים ושש")
-      , (87, "שמונים ושבע")
-      , (88, "שמונים ושמונה")
-      , (89, "שמונים ותשע")
-      , (90, "תשעים")
-      , (91, "תשעים ואחת")
-      , (92, "תשעים ושתיים")
-      , (93, "תשעים ושלוש")
-      , (94, "תשעים וארבע")
-      , (95, "תשעים וחמש")
-      , (96, "תשעים ושש")
-      , (97, "תשעים ושבע")
-      , (98, "תשעים ושמונה")
-      , (99, "תשעים ותשע")
-      , (100, "מאה")
-      , (101, "מאה ואחת")
-      , (110, "מאה ועשר")
-      , (111, "מאה אחת עשרה")
-      , (123, "מאה עשרים ושלוש")
-      , (144, "מאה ארבעים וארבע")
-      , (199, "מאה תשעים ותשע")
-      , (200, "מאתיים")
-      , (299, "מאתיים תשעים ותשע")
-      , (300, "שלוש מאות")
-      , (400, "ארבע מאות")
-      , (900, "תשע מאות")
-      , (1000, "אלף")
-      , (1999, "אלף תשע מאות תשעים ותשע")
-      , (2000, "אלפיים")
-      , (2999, "אלפיים תשע מאות תשעים ותשע")
-      , (3000, "שלושת אלפים")
-      , (3110, "שלושת אלפים מאה ועשר")
-      , (4000, "ארבעת אלפים")
-      , (5000, "חמשת אלפים")
-      , (6000, "ששת אלפים")
-      , (7000, "שבעת אלפים")
-      , (8000, "שמונת אלפים")
-      , (9000, "תשעת אלפים")
-      , (10000, "עשרת אלפים")
-      , (11000, "אחד עשר אלף")
-      , (12000, "שנים עשר אלף")
-      , (dec 5, "מאה אלף")
-      , (dec 6, "מיליון")
-      , (dec 9, "מיליארד")
-      ]
-    )
-  , ( "masculine"
-    , masculine defaultInflection
-    , [ (0, "אפס")
-      , (1, "אחד")
-      , (2, "שניים") -- Connecting form: "שני"
-      , (3, "שלושה")
-      , (4, "ארבעה")
-      , (5, "חמישה")
-      , (6, "שישה")
-      , (7, "שבעה")
-      , (8, "שמונה")
-      , (9, "תשעה")
-      , (10, "עשרה")
-      , (11, "אחד עשר")
-      , (12, "שנים עשר")
-      , (13, "שלושה עשר")
-      , (14, "ארבעה עשר")
-      , (15, "חמישה עשר")
-      , (16, "שישה עשר")
-      , (17, "שבעה עשר")
-      , (18, "שמונה עשר")
-      , (19, "תשעה עשר")
-      , (20, "עשרים")
-      , (21, "עשרים ואחד")
-      , (22, "עשרים ושניים")
-      , (23, "עשרים ושלושה")
-      , (24, "עשרים וארבעה")
-      , (25, "עשרים וחמישה")
-      , (26, "עשרים ושישה")
-      , (27, "עשרים ושבעה")
-      , (28, "עשרים ושמונה")
-      , (29, "עשרים ותשעה")
-      , (30, "שלושים")
-      , (31, "שלושים ואחד")
-      , (32, "שלושים ושניים")
-      , (33, "שלושים ושלושה")
-      , (34, "שלושים וארבעה")
-      , (35, "שלושים וחמישה")
-      , (36, "שלושים ושישה")
-      , (37, "שלושים ושבעה")
-      , (38, "שלושים ושמונה")
-      , (39, "שלושים ותשעה")
-      , (40, "ארבעים")
-      , (41, "ארבעים ואחד")
-      , (42, "ארבעים ושניים")
-      , (43, "ארבעים ושלושה")
-      , (44, "ארבעים וארבעה")
-      , (45, "ארבעים וחמישה")
-      , (46, "ארבעים ושישה")
-      , (47, "ארבעים ושבעה")
-      , (48, "ארבעים ושמונה")
-      , (49, "ארבעים ותשעה")
-      , (50, "חמישים")
-      , (51, "חמישים ואחד")
-      , (52, "חמישים ושניים")
-      , (53, "חמישים ושלושה")
-      , (54, "חמישים וארבעה")
-      , (55, "חמישים וחמישה")
-      , (56, "חמישים ושישה")
-      , (57, "חמישים ושבעה")
-      , (58, "חמישים ושמונה")
-      , (59, "חמישים ותשעה")
-      , (60, "ששים")
-      , (61, "ששים ואחד")
-      , (62, "ששים ושניים")
-      , (63, "ששים ושלושה")
-      , (64, "ששים וארבעה")
-      , (65, "ששים וחמישה")
-      , (66, "ששים ושישה")
-      , (67, "ששים ושבעה")
-      , (68, "ששים ושמונה")
-      , (69, "ששים ותשעה")
-      , (70, "שבעים")
-      , (71, "שבעים ואחד")
-      , (72, "שבעים ושניים")
-      , (73, "שבעים ושלושה")
-      , (74, "שבעים וארבעה")
-      , (75, "שבעים וחמישה")
-      , (76, "שבעים ושישה")
-      , (77, "שבעים ושבעה")
-      , (78, "שבעים ושמונה")
-      , (79, "שבעים ותשעה")
-      , (80, "שמונים")
-      , (81, "שמונים ואחד")
-      , (82, "שמונים ושניים")
-      , (83, "שמונים ושלושה")
-      , (84, "שמונים וארבעה")
-      , (85, "שמונים וחמישה")
-      , (86, "שמונים ושישה")
-      , (87, "שמונים ושבעה")
-      , (88, "שמונים ושמונה")
-      , (89, "שמונים ותשעה")
-      , (90, "תשעים")
-      , (91, "תשעים ואחד")
-      , (92, "תשעים ושניים")
-      , (93, "תשעים ושלושה")
-      , (94, "תשעים וארבעה")
-      , (95, "תשעים וחמישה")
-      , (96, "תשעים ושישה")
-      , (97, "תשעים ושבעה")
-      , (98, "תשעים ושמונה")
-      , (99, "תשעים ותשעה")
-      , (100, "מאה")
-      , (101, "מאה ואחד")
-      , (110, "מאה ועשרה")
-      , (111, "מאה אחד עשרה")
-      , (123, "מאה עשרים ושלושה")
-      , (144, "מאה ארבעים וארבעה")
-      , (199, "מאה תשעים ותשעה")
-      , (200, "מאתיים")
-      , (299, "מאתיים תשעים ותשעה")
-      , (300, "שלוש מאות")
-      , (400, "ארבע מאות")
-      , (900, "תשע מאות")
-      , (1000, "אלף")
-      , (1999, "אלף תשע מאות תשעים ותשעה")
-      , (2000, "אלפיים")
-      , (2999, "אלפיים תשע מאות תשעים ותשעה")
-      , (3000, "שלושת אלפים")
-      , (3110, "שלושת אלפים מאה ועשרה")
-      , (4000, "ארבעת אלפים")
-      , (5000, "חמשת אלפים")
-      , (6000, "ששת אלפים")
-      , (7000, "שבעת אלפים")
-      , (8000, "שמונת אלפים")
-      , (9000, "תשעת אלפים")
-      , (10000, "עשרת אלפים")
-      , (11000, "אחד עשר אלף")
-      , (12000, "שנים עשר אלף")
-      , (dec 5, "מאה אלף")
-      , (dec 6, "מיליון")
-      , (dec 9, "מיליארד")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/HEB/TestData.hs b/src-test/Text/Numeral/Language/HEB/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/HEB/TestData.hs
@@ -0,0 +1,308 @@
+{-|
+[@ISO639-1@]        he
+
+[@ISO639-2@]        heb
+
+[@ISO639-3@]        heb
+
+[@Native name@]     עִבְרִית
+
+[@English name@]    Modern Hebrew
+-}
+
+module Text.Numeral.Language.HEB.TestData
+  ( cardinals
+  ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Grammar
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  E-mail by Yitzchak Gale.
+  http://www.hebrew4christians.com/Grammar/Unit_Eight/Cardinal_Numbers/cardinal_numbers.html
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "feminine"
+    , feminine defaultInflection
+    , [ (0, "אפס")
+      , (1, "אחת")
+      , (2, "שתיים") -- Connecting form: "שתי"
+      , (3, "שלוש")
+      , (4, "ארבע")
+      , (5, "חמש")
+      , (6, "שש")
+      , (7, "שבע")
+      , (8, "שמונה")
+      , (9, "תשע")
+      , (10, "עשר")
+      , (11, "אחת עשרה")
+      , (12, "שתים עשרה")
+      , (13, "שלוש עשרה")
+      , (14, "ארבע עשרה")
+      , (15, "חמש עשרה")
+      , (16, "שש עשרה")
+      , (17, "שבע עשרה")
+      , (18, "שמונה עשרה")
+      , (19, "תשע עשרה")
+      , (20, "עשרים")
+      , (21, "עשרים ואחת")
+      , (22, "עשרים ושתיים")
+      , (23, "עשרים ושלוש")
+      , (24, "עשרים וארבע")
+      , (25, "עשרים וחמש")
+      , (26, "עשרים ושש")
+      , (27, "עשרים ושבע")
+      , (28, "עשרים ושמונה")
+      , (29, "עשרים ותשע")
+      , (30, "שלושים")
+      , (31, "שלושים ואחת")
+      , (32, "שלושים ושתיים")
+      , (33, "שלושים ושלוש")
+      , (34, "שלושים וארבע")
+      , (35, "שלושים וחמש")
+      , (36, "שלושים ושש")
+      , (37, "שלושים ושבע")
+      , (38, "שלושים ושמונה")
+      , (39, "שלושים ותשע")
+      , (40, "ארבעים")
+      , (41, "ארבעים ואחת")
+      , (42, "ארבעים ושתיים")
+      , (43, "ארבעים ושלוש")
+      , (44, "ארבעים וארבע")
+      , (45, "ארבעים וחמש")
+      , (46, "ארבעים ושש")
+      , (47, "ארבעים ושבע")
+      , (48, "ארבעים ושמונה")
+      , (49, "ארבעים ותשע")
+      , (50, "חמישים")
+      , (51, "חמישים ואחת")
+      , (52, "חמישים ושתיים")
+      , (53, "חמישים ושלוש")
+      , (54, "חמישים וארבע")
+      , (55, "חמישים וחמש")
+      , (56, "חמישים ושש")
+      , (57, "חמישים ושבע")
+      , (58, "חמישים ושמונה")
+      , (59, "חמישים ותשע")
+      , (60, "ששים")
+      , (61, "ששים ואחת")
+      , (62, "ששים ושתיים")
+      , (63, "ששים ושלוש")
+      , (64, "ששים וארבע")
+      , (65, "ששים וחמש")
+      , (66, "ששים ושש")
+      , (67, "ששים ושבע")
+      , (68, "ששים ושמונה")
+      , (69, "ששים ותשע")
+      , (70, "שבעים")
+      , (71, "שבעים ואחת")
+      , (72, "שבעים ושתיים")
+      , (73, "שבעים ושלוש")
+      , (74, "שבעים וארבע")
+      , (75, "שבעים וחמש")
+      , (76, "שבעים ושש")
+      , (77, "שבעים ושבע")
+      , (78, "שבעים ושמונה")
+      , (79, "שבעים ותשע")
+      , (80, "שמונים")
+      , (81, "שמונים ואחת")
+      , (82, "שמונים ושתיים")
+      , (83, "שמונים ושלוש")
+      , (84, "שמונים וארבע")
+      , (85, "שמונים וחמש")
+      , (86, "שמונים ושש")
+      , (87, "שמונים ושבע")
+      , (88, "שמונים ושמונה")
+      , (89, "שמונים ותשע")
+      , (90, "תשעים")
+      , (91, "תשעים ואחת")
+      , (92, "תשעים ושתיים")
+      , (93, "תשעים ושלוש")
+      , (94, "תשעים וארבע")
+      , (95, "תשעים וחמש")
+      , (96, "תשעים ושש")
+      , (97, "תשעים ושבע")
+      , (98, "תשעים ושמונה")
+      , (99, "תשעים ותשע")
+      , (100, "מאה")
+      , (101, "מאה ואחת")
+      , (110, "מאה ועשר")
+      , (111, "מאה אחת עשרה")
+      , (123, "מאה עשרים ושלוש")
+      , (144, "מאה ארבעים וארבע")
+      , (199, "מאה תשעים ותשע")
+      , (200, "מאתיים")
+      , (299, "מאתיים תשעים ותשע")
+      , (300, "שלוש מאות")
+      , (400, "ארבע מאות")
+      , (900, "תשע מאות")
+      , (1000, "אלף")
+      , (1999, "אלף תשע מאות תשעים ותשע")
+      , (2000, "אלפיים")
+      , (2999, "אלפיים תשע מאות תשעים ותשע")
+      , (3000, "שלושת אלפים")
+      , (3110, "שלושת אלפים מאה ועשר")
+      , (4000, "ארבעת אלפים")
+      , (5000, "חמשת אלפים")
+      , (6000, "ששת אלפים")
+      , (7000, "שבעת אלפים")
+      , (8000, "שמונת אלפים")
+      , (9000, "תשעת אלפים")
+      , (10000, "עשרת אלפים")
+      , (11000, "אחד עשר אלף")
+      , (12000, "שנים עשר אלף")
+      , (dec 5, "מאה אלף")
+      , (dec 6, "מיליון")
+      , (dec 9, "מיליארד")
+      ]
+    )
+  , ( "masculine"
+    , masculine defaultInflection
+    , [ (0, "אפס")
+      , (1, "אחד")
+      , (2, "שניים") -- Connecting form: "שני"
+      , (3, "שלושה")
+      , (4, "ארבעה")
+      , (5, "חמישה")
+      , (6, "שישה")
+      , (7, "שבעה")
+      , (8, "שמונה")
+      , (9, "תשעה")
+      , (10, "עשרה")
+      , (11, "אחד עשר")
+      , (12, "שנים עשר")
+      , (13, "שלושה עשר")
+      , (14, "ארבעה עשר")
+      , (15, "חמישה עשר")
+      , (16, "שישה עשר")
+      , (17, "שבעה עשר")
+      , (18, "שמונה עשר")
+      , (19, "תשעה עשר")
+      , (20, "עשרים")
+      , (21, "עשרים ואחד")
+      , (22, "עשרים ושניים")
+      , (23, "עשרים ושלושה")
+      , (24, "עשרים וארבעה")
+      , (25, "עשרים וחמישה")
+      , (26, "עשרים ושישה")
+      , (27, "עשרים ושבעה")
+      , (28, "עשרים ושמונה")
+      , (29, "עשרים ותשעה")
+      , (30, "שלושים")
+      , (31, "שלושים ואחד")
+      , (32, "שלושים ושניים")
+      , (33, "שלושים ושלושה")
+      , (34, "שלושים וארבעה")
+      , (35, "שלושים וחמישה")
+      , (36, "שלושים ושישה")
+      , (37, "שלושים ושבעה")
+      , (38, "שלושים ושמונה")
+      , (39, "שלושים ותשעה")
+      , (40, "ארבעים")
+      , (41, "ארבעים ואחד")
+      , (42, "ארבעים ושניים")
+      , (43, "ארבעים ושלושה")
+      , (44, "ארבעים וארבעה")
+      , (45, "ארבעים וחמישה")
+      , (46, "ארבעים ושישה")
+      , (47, "ארבעים ושבעה")
+      , (48, "ארבעים ושמונה")
+      , (49, "ארבעים ותשעה")
+      , (50, "חמישים")
+      , (51, "חמישים ואחד")
+      , (52, "חמישים ושניים")
+      , (53, "חמישים ושלושה")
+      , (54, "חמישים וארבעה")
+      , (55, "חמישים וחמישה")
+      , (56, "חמישים ושישה")
+      , (57, "חמישים ושבעה")
+      , (58, "חמישים ושמונה")
+      , (59, "חמישים ותשעה")
+      , (60, "ששים")
+      , (61, "ששים ואחד")
+      , (62, "ששים ושניים")
+      , (63, "ששים ושלושה")
+      , (64, "ששים וארבעה")
+      , (65, "ששים וחמישה")
+      , (66, "ששים ושישה")
+      , (67, "ששים ושבעה")
+      , (68, "ששים ושמונה")
+      , (69, "ששים ותשעה")
+      , (70, "שבעים")
+      , (71, "שבעים ואחד")
+      , (72, "שבעים ושניים")
+      , (73, "שבעים ושלושה")
+      , (74, "שבעים וארבעה")
+      , (75, "שבעים וחמישה")
+      , (76, "שבעים ושישה")
+      , (77, "שבעים ושבעה")
+      , (78, "שבעים ושמונה")
+      , (79, "שבעים ותשעה")
+      , (80, "שמונים")
+      , (81, "שמונים ואחד")
+      , (82, "שמונים ושניים")
+      , (83, "שמונים ושלושה")
+      , (84, "שמונים וארבעה")
+      , (85, "שמונים וחמישה")
+      , (86, "שמונים ושישה")
+      , (87, "שמונים ושבעה")
+      , (88, "שמונים ושמונה")
+      , (89, "שמונים ותשעה")
+      , (90, "תשעים")
+      , (91, "תשעים ואחד")
+      , (92, "תשעים ושניים")
+      , (93, "תשעים ושלושה")
+      , (94, "תשעים וארבעה")
+      , (95, "תשעים וחמישה")
+      , (96, "תשעים ושישה")
+      , (97, "תשעים ושבעה")
+      , (98, "תשעים ושמונה")
+      , (99, "תשעים ותשעה")
+      , (100, "מאה")
+      , (101, "מאה ואחד")
+      , (110, "מאה ועשרה")
+      , (111, "מאה אחד עשרה")
+      , (123, "מאה עשרים ושלושה")
+      , (144, "מאה ארבעים וארבעה")
+      , (199, "מאה תשעים ותשעה")
+      , (200, "מאתיים")
+      , (299, "מאתיים תשעים ותשעה")
+      , (300, "שלוש מאות")
+      , (400, "ארבע מאות")
+      , (900, "תשע מאות")
+      , (1000, "אלף")
+      , (1999, "אלף תשע מאות תשעים ותשעה")
+      , (2000, "אלפיים")
+      , (2999, "אלפיים תשע מאות תשעים ותשעה")
+      , (3000, "שלושת אלפים")
+      , (3110, "שלושת אלפים מאה ועשרה")
+      , (4000, "ארבעת אלפים")
+      , (5000, "חמשת אלפים")
+      , (6000, "ששת אלפים")
+      , (7000, "שבעת אלפים")
+      , (8000, "שמונת אלפים")
+      , (9000, "תשעת אלפים")
+      , (10000, "עשרת אלפים")
+      , (11000, "אחד עשר אלף")
+      , (12000, "שנים עשר אלף")
+      , (dec 5, "מאה אלף")
+      , (dec 6, "מיליון")
+      , (dec 9, "מיליארד")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/HOP/TestData.hs b/src-test/Text/Numeral/Language/HOP/TestData.hs
--- a/src-test/Text/Numeral/Language/HOP/TestData.hs
+++ b/src-test/Text/Numeral/Language/HOP/TestData.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -23,8 +17,8 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Integral, (+) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "base" Prelude ( Integral )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -34,7 +28,7 @@
 
 -- Sources:
 --   http://www.languagesandnumbers.com/how-to-count-in-hopi/en/hop/
-cardinals ∷ (Integral i) ⇒ TestData i
+cardinals :: (Integral i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/HR/TestData.hs b/src-test/Text/Numeral/Language/HR/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/HR/TestData.hs
+++ /dev/null
@@ -1,142 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        hr
-
-[@ISO639-2@]        hrv
-
-[@ISO639-3@]        hrv
-
-[@Native name@]     Hrvatski
-
-[@English name@]    Croatian
--}
-
-module Text.Numeral.Language.HR.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- HR - Croatian
---------------------------------------------------------------------------------
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "nula")
-      , (1, "jedan")
-      , (2, "dva")
-      , (3, "tri")
-      , (4, "cetiri")
-      , (5, "pet")
-      , (6, "šest")
-      , (7, "sedam")
-      , (8, "osam")
-      , (9, "devet")
-      , (10, "deset")
-      , (11, "jedanaest")
-      , (12, "dvanaest")
-      , (13, "trinaest")
-      , (14, "cetrnaest")
-      , (15, "petnaest")
-      , (16, "šesnaest")
-      , (17, "sedamnaest")
-      , (18, "osamnaest")
-      , (19, "devetnaest")
-      , (20, "dvadeset")
-      , (21, "dvadeseti jedan")
-      , (22, "dvadeseti dva")
-      , (23, "dvadeseti tri")
-      , (24, "dvadeseti cetiri")
-      , (25, "dvadeseti pet")
-      , (26, "dvadeseti šest")
-      , (27, "dvadeseti sedam")
-      , (28, "dvadeseti osam")
-      , (29, "dvadeseti devet")
-      , (30, "drideset")
-      , (31, "drideseti jedan")
-      , (32, "drideseti dva")
-      , (33, "drideseti tri")
-      , (34, "drideseti cetiri")
-      , (35, "drideseti pet")
-      , (36, "drideseti šest")
-      , (37, "drideseti sedam")
-      , (38, "drideseti osam")
-      , (39, "drideseti devet")
-      , (40, "cetrdeset")
-      , (41, "cetrdeseti jedan")
-      , (42, "cetrdeseti dva")
-      , (43, "cetrdeseti tri")
-      , (44, "cetrdeseti cetiri")
-      , (45, "cetrdeseti pet")
-      , (46, "cetrdeseti šest")
-      , (47, "cetrdeseti sedam")
-      , (48, "cetrdeseti osam")
-      , (49, "cetrdeseti devet")
-      , (50, "pedeset")
-      , (51, "pedeseti jedan")
-      , (52, "pedeseti dva")
-      , (53, "pedeseti tri")
-      , (54, "pedeseti cetiri")
-      , (55, "pedeseti pet")
-      , (56, "pedeseti šest")
-      , (57, "pedeseti sedam")
-      , (58, "pedeseti osam")
-      , (59, "pedeseti devet")
-      , (60, "šezdezet")
-      , (61, "šezdezeti jedan")
-      , (62, "šezdezeti dva")
-      , (63, "šezdezeti tri")
-      , (64, "šezdezeti cetiri")
-      , (65, "šezdezeti pet")
-      , (66, "šezdezeti šest")
-      , (67, "šezdezeti sedam")
-      , (68, "šezdezeti osam")
-      , (69, "šezdezeti devet")
-      , (70, "sedamdezet")
-      , (71, "sedamdezeti jedan")
-      , (72, "sedamdezeti dva")
-      , (73, "sedamdezeti tri")
-      , (74, "sedamdezeti cetiri")
-      , (75, "sedamdezeti pet")
-      , (76, "sedamdezeti šest")
-      , (77, "sedamdezeti sedam")
-      , (78, "sedamdezeti osam")
-      , (79, "sedamdezeti devet")
-      , (80, "osamdeset")
-      , (81, "osamdeseti jedan")
-      , (82, "osamdeseti dva")
-      , (83, "osamdeseti tri")
-      , (84, "osamdeseti cetiri")
-      , (85, "osamdeseti pet")
-      , (86, "osamdeseti šest")
-      , (87, "osamdeseti sedam")
-      , (88, "osamdeseti osam")
-      , (89, "osamdeseti devet")
-      , (90, "deveteset")
-      , (91, "deveteseti jedan")
-      , (92, "deveteseti dva")
-      , (93, "deveteseti tri")
-      , (94, "deveteseti cetiri")
-      , (95, "deveteseti pet")
-      , (96, "deveteseti šest")
-      , (97, "deveteseti sedam")
-      , (98, "deveteseti osam")
-      , (99, "deveteseti devet")
-      , (100, "sto")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/HRV/TestData.hs b/src-test/Text/Numeral/Language/HRV/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/HRV/TestData.hs
@@ -0,0 +1,135 @@
+{-|
+[@ISO639-1@]        hr
+
+[@ISO639-2@]        hrv
+
+[@ISO639-3@]        hrv
+
+[@Native name@]     Hrvatski
+
+[@English name@]    Croatian
+-}
+
+module Text.Numeral.Language.HRV.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- HRV - Croatian
+--------------------------------------------------------------------------------
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "nula")
+      , (1, "jedan")
+      , (2, "dva")
+      , (3, "tri")
+      , (4, "cetiri")
+      , (5, "pet")
+      , (6, "šest")
+      , (7, "sedam")
+      , (8, "osam")
+      , (9, "devet")
+      , (10, "deset")
+      , (11, "jedanaest")
+      , (12, "dvanaest")
+      , (13, "trinaest")
+      , (14, "cetrnaest")
+      , (15, "petnaest")
+      , (16, "šesnaest")
+      , (17, "sedamnaest")
+      , (18, "osamnaest")
+      , (19, "devetnaest")
+      , (20, "dvadeset")
+      , (21, "dvadeseti jedan")
+      , (22, "dvadeseti dva")
+      , (23, "dvadeseti tri")
+      , (24, "dvadeseti cetiri")
+      , (25, "dvadeseti pet")
+      , (26, "dvadeseti šest")
+      , (27, "dvadeseti sedam")
+      , (28, "dvadeseti osam")
+      , (29, "dvadeseti devet")
+      , (30, "drideset")
+      , (31, "drideseti jedan")
+      , (32, "drideseti dva")
+      , (33, "drideseti tri")
+      , (34, "drideseti cetiri")
+      , (35, "drideseti pet")
+      , (36, "drideseti šest")
+      , (37, "drideseti sedam")
+      , (38, "drideseti osam")
+      , (39, "drideseti devet")
+      , (40, "cetrdeset")
+      , (41, "cetrdeseti jedan")
+      , (42, "cetrdeseti dva")
+      , (43, "cetrdeseti tri")
+      , (44, "cetrdeseti cetiri")
+      , (45, "cetrdeseti pet")
+      , (46, "cetrdeseti šest")
+      , (47, "cetrdeseti sedam")
+      , (48, "cetrdeseti osam")
+      , (49, "cetrdeseti devet")
+      , (50, "pedeset")
+      , (51, "pedeseti jedan")
+      , (52, "pedeseti dva")
+      , (53, "pedeseti tri")
+      , (54, "pedeseti cetiri")
+      , (55, "pedeseti pet")
+      , (56, "pedeseti šest")
+      , (57, "pedeseti sedam")
+      , (58, "pedeseti osam")
+      , (59, "pedeseti devet")
+      , (60, "šezdezet")
+      , (61, "šezdezeti jedan")
+      , (62, "šezdezeti dva")
+      , (63, "šezdezeti tri")
+      , (64, "šezdezeti cetiri")
+      , (65, "šezdezeti pet")
+      , (66, "šezdezeti šest")
+      , (67, "šezdezeti sedam")
+      , (68, "šezdezeti osam")
+      , (69, "šezdezeti devet")
+      , (70, "sedamdezet")
+      , (71, "sedamdezeti jedan")
+      , (72, "sedamdezeti dva")
+      , (73, "sedamdezeti tri")
+      , (74, "sedamdezeti cetiri")
+      , (75, "sedamdezeti pet")
+      , (76, "sedamdezeti šest")
+      , (77, "sedamdezeti sedam")
+      , (78, "sedamdezeti osam")
+      , (79, "sedamdezeti devet")
+      , (80, "osamdeset")
+      , (81, "osamdeseti jedan")
+      , (82, "osamdeseti dva")
+      , (83, "osamdeseti tri")
+      , (84, "osamdeseti cetiri")
+      , (85, "osamdeseti pet")
+      , (86, "osamdeseti šest")
+      , (87, "osamdeseti sedam")
+      , (88, "osamdeseti osam")
+      , (89, "osamdeseti devet")
+      , (90, "deveteset")
+      , (91, "deveteseti jedan")
+      , (92, "deveteseti dva")
+      , (93, "deveteseti tri")
+      , (94, "deveteseti cetiri")
+      , (95, "deveteseti pet")
+      , (96, "deveteseti šest")
+      , (97, "deveteseti sedam")
+      , (98, "deveteseti osam")
+      , (99, "deveteseti devet")
+      , (100, "sto")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/HU/TestData.hs b/src-test/Text/Numeral/Language/HU/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/HU/TestData.hs
+++ /dev/null
@@ -1,142 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        hu
-
-[@ISO639-2@]        hun
-
-[@ISO639-3@]        hun
-
-[@Native name@]     magyar
-
-[@English name@]    Hungarian
--}
-
-module Text.Numeral.Language.HU.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "nulla")
-      , (1, "egy")
-      , (2, "kettö")
-      , (3, "három")
-      , (4, "négy")
-      , (5, "öt")
-      , (6, "hat")
-      , (7, "hét")
-      , (8, "nyolc")
-      , (9, "kilenc")
-      , (10, "tíz")
-      , (11, "tízenegy")
-      , (12, "tízenkettö")
-      , (13, "tízenhárom")
-      , (14, "tízennégy")
-      , (15, "tízenöt")
-      , (16, "tízenhat")
-      , (17, "tízenhét")
-      , (18, "tízennyolc")
-      , (19, "tízenkilenc")
-      , (20, "húsz")
-      , (21, "húszonegy")
-      , (22, "húszonkettö")
-      , (23, "húszonhárom")
-      , (24, "húszonnégy")
-      , (25, "húszonöt")
-      , (26, "húszonhat")
-      , (27, "húszonhét")
-      , (28, "húszonnyolc")
-      , (29, "húszonkilenc")
-      , (30, "harminc")
-      , (31, "harmincegy")
-      , (32, "harminckettö")
-      , (33, "harminchárom")
-      , (34, "harmincnégy")
-      , (35, "harmincöt")
-      , (36, "harminchat")
-      , (37, "harminchét")
-      , (38, "harmincnyolc")
-      , (39, "harminckilenc")
-      , (40, "negyven")
-      , (41, "negyvenegy")
-      , (42, "negyvenkettö")
-      , (43, "negyvenhárom")
-      , (44, "negyvennégy")
-      , (45, "negyvenöt")
-      , (46, "negyvenhat")
-      , (47, "negyvenhét")
-      , (48, "negyvennyolc")
-      , (49, "negyvenkilenc")
-      , (50, "ötven")
-      , (51, "ötvenegy")
-      , (52, "ötvenkettö")
-      , (53, "ötvenhárom")
-      , (54, "ötvennégy")
-      , (55, "ötvenöt")
-      , (56, "ötvenhat")
-      , (57, "ötvenhét")
-      , (58, "ötvennyolc")
-      , (59, "ötvenkilenc")
-      , (60, "hatvan")
-      , (61, "hatvanegy")
-      , (62, "hatvankettö")
-      , (63, "hatvanhárom")
-      , (64, "hatvannégy")
-      , (65, "hatvanöt")
-      , (66, "hatvanhat")
-      , (67, "hatvanhét")
-      , (68, "hatvannyolc")
-      , (69, "hatvankilenc")
-      , (70, "hetven")
-      , (71, "hetvenegy")
-      , (72, "hetvenkettö")
-      , (73, "hetvenhárom")
-      , (74, "hetvennégy")
-      , (75, "hetvenöt")
-      , (76, "hetvenhat")
-      , (77, "hetvenhét")
-      , (78, "hetvennyolc")
-      , (79, "hetvenkilenc")
-      , (80, "nyolcvan")
-      , (81, "nyolcvanegy")
-      , (82, "nyolcvankettö")
-      , (83, "nyolcvanhárom")
-      , (84, "nyolcvannégy")
-      , (85, "nyolcvanöt")
-      , (86, "nyolcvanhat")
-      , (87, "nyolcvanhét")
-      , (88, "nyolcvannyolc")
-      , (89, "nyolcvankilenc")
-      , (90, "kilencven")
-      , (91, "kilencvenegy")
-      , (92, "kilencvenkettö")
-      , (93, "kilencvenhárom")
-      , (94, "kilencvennégy")
-      , (95, "kilencvenöt")
-      , (96, "kilencvenhat")
-      , (97, "kilencvenhét")
-      , (98, "kilencvennyolc")
-      , (99, "kilencvenkilenc")
-      , (100, "száz")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/HUN/TestData.hs b/src-test/Text/Numeral/Language/HUN/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/HUN/TestData.hs
@@ -0,0 +1,135 @@
+{-|
+[@ISO639-1@]        hu
+
+[@ISO639-2@]        hun
+
+[@ISO639-3@]        hun
+
+[@Native name@]     magyar
+
+[@English name@]    Hungarian
+-}
+
+module Text.Numeral.Language.HUN.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "nulla")
+      , (1, "egy")
+      , (2, "kettö")
+      , (3, "három")
+      , (4, "négy")
+      , (5, "öt")
+      , (6, "hat")
+      , (7, "hét")
+      , (8, "nyolc")
+      , (9, "kilenc")
+      , (10, "tíz")
+      , (11, "tízenegy")
+      , (12, "tízenkettö")
+      , (13, "tízenhárom")
+      , (14, "tízennégy")
+      , (15, "tízenöt")
+      , (16, "tízenhat")
+      , (17, "tízenhét")
+      , (18, "tízennyolc")
+      , (19, "tízenkilenc")
+      , (20, "húsz")
+      , (21, "húszonegy")
+      , (22, "húszonkettö")
+      , (23, "húszonhárom")
+      , (24, "húszonnégy")
+      , (25, "húszonöt")
+      , (26, "húszonhat")
+      , (27, "húszonhét")
+      , (28, "húszonnyolc")
+      , (29, "húszonkilenc")
+      , (30, "harminc")
+      , (31, "harmincegy")
+      , (32, "harminckettö")
+      , (33, "harminchárom")
+      , (34, "harmincnégy")
+      , (35, "harmincöt")
+      , (36, "harminchat")
+      , (37, "harminchét")
+      , (38, "harmincnyolc")
+      , (39, "harminckilenc")
+      , (40, "negyven")
+      , (41, "negyvenegy")
+      , (42, "negyvenkettö")
+      , (43, "negyvenhárom")
+      , (44, "negyvennégy")
+      , (45, "negyvenöt")
+      , (46, "negyvenhat")
+      , (47, "negyvenhét")
+      , (48, "negyvennyolc")
+      , (49, "negyvenkilenc")
+      , (50, "ötven")
+      , (51, "ötvenegy")
+      , (52, "ötvenkettö")
+      , (53, "ötvenhárom")
+      , (54, "ötvennégy")
+      , (55, "ötvenöt")
+      , (56, "ötvenhat")
+      , (57, "ötvenhét")
+      , (58, "ötvennyolc")
+      , (59, "ötvenkilenc")
+      , (60, "hatvan")
+      , (61, "hatvanegy")
+      , (62, "hatvankettö")
+      , (63, "hatvanhárom")
+      , (64, "hatvannégy")
+      , (65, "hatvanöt")
+      , (66, "hatvanhat")
+      , (67, "hatvanhét")
+      , (68, "hatvannyolc")
+      , (69, "hatvankilenc")
+      , (70, "hetven")
+      , (71, "hetvenegy")
+      , (72, "hetvenkettö")
+      , (73, "hetvenhárom")
+      , (74, "hetvennégy")
+      , (75, "hetvenöt")
+      , (76, "hetvenhat")
+      , (77, "hetvenhét")
+      , (78, "hetvennyolc")
+      , (79, "hetvenkilenc")
+      , (80, "nyolcvan")
+      , (81, "nyolcvanegy")
+      , (82, "nyolcvankettö")
+      , (83, "nyolcvanhárom")
+      , (84, "nyolcvannégy")
+      , (85, "nyolcvanöt")
+      , (86, "nyolcvanhat")
+      , (87, "nyolcvanhét")
+      , (88, "nyolcvannyolc")
+      , (89, "nyolcvankilenc")
+      , (90, "kilencven")
+      , (91, "kilencvenegy")
+      , (92, "kilencvenkettö")
+      , (93, "kilencvenhárom")
+      , (94, "kilencvennégy")
+      , (95, "kilencvenöt")
+      , (96, "kilencvenhat")
+      , (97, "kilencvenhét")
+      , (98, "kilencvennyolc")
+      , (99, "kilencvenkilenc")
+      , (100, "száz")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/HUP/TestData.hs b/src-test/Text/Numeral/Language/HUP/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/HUP/TestData.hs
@@ -0,0 +1,162 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        hup
+
+[@ISO639-3@]        hup
+
+[@Native name@]     -
+
+[@English name@]    Hupa
+-}
+module Text.Numeral.Language.HUP.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-hupa/en/hup/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "ła’")
+      , (2, "nahx")
+      , (3, "ta:q’")
+      , (4, "dink’")
+      , (5, "chwola’")
+      , (6, "xosta:n")
+      , (7, "xohk’it")
+      , (8, "ke:nim")
+      , (9, "miq’os-t’aw")
+      , (10, "minłung")
+      , (11, "minłung-miwah-na:ła’")
+      , (12, "minłung-miwah-na:nahx")
+      , (13, "minłung-miwah-na:ta:q’")
+      , (14, "minłung-miwah-na:dink’")
+      , (15, "minłung-miwah-na:chwola’")
+      , (16, "minłung-miwah-na:xosta:n")
+      , (17, "minłung-miwah-na:xohk’it")
+      , (18, "minłung-miwah-na:ke:nim")
+      , (19, "minłung-miwah-na:miq’os-t’aw")
+      , (20, "nahdiminłung")
+      , (21, "nahdiminłung-miwah-na:ła’")
+      , (22, "nahdiminłung-miwah-na:nahx")
+      , (23, "nahdiminłung-miwah-na:ta:q’")
+      , (24, "nahdiminłung-miwah-na:dink’")
+      , (25, "nahdiminłung-miwah-na:chwola’")
+      , (26, "nahdiminłung-miwah-na:xosta:n")
+      , (27, "nahdiminłung-miwah-na:xohk’it")
+      , (28, "nahdiminłung-miwah-na:ke:nim")
+      , (29, "nahdiminłung-miwah-na:miq’os-t’aw")
+      , (30, "ta:q’idiminłung")
+      , (31, "ta:q’idiminłung-miwah-na:ła’")
+      , (32, "ta:q’idiminłung-miwah-na:nahx")
+      , (33, "ta:q’idiminłung-miwah-na:ta:q’")
+      , (34, "ta:q’idiminłung-miwah-na:dink’")
+      , (35, "ta:q’idiminłung-miwah-na:chwola’")
+      , (36, "ta:q’idiminłung-miwah-na:xosta:n")
+      , (37, "ta:q’idiminłung-miwah-na:xohk’it")
+      , (38, "ta:q’idiminłung-miwah-na:ke:nim")
+      , (39, "ta:q’idiminłung-miwah-na:miq’os-t’aw")
+      , (40, "dink’idiminłung")
+      , (41, "dink’idiminłung-miwah-na:ła’")
+      , (42, "dink’idiminłung-miwah-na:nahx")
+      , (43, "dink’idiminłung-miwah-na:ta:q’")
+      , (44, "dink’idiminłung-miwah-na:dink’")
+      , (45, "dink’idiminłung-miwah-na:chwola’")
+      , (46, "dink’idiminłung-miwah-na:xosta:n")
+      , (47, "dink’idiminłung-miwah-na:xohk’it")
+      , (48, "dink’idiminłung-miwah-na:ke:nim")
+      , (49, "dink’idiminłung-miwah-na:miq’os-t’aw")
+      , (50, "chwola’diminłung")
+      , (51, "chwola’diminłung-miwah-na:ła’")
+      , (52, "chwola’diminłung-miwah-na:nahx")
+      , (53, "chwola’diminłung-miwah-na:ta:q’")
+      , (54, "chwola’diminłung-miwah-na:dink’")
+      , (55, "chwola’diminłung-miwah-na:chwola’")
+      , (56, "chwola’diminłung-miwah-na:xosta:n")
+      , (57, "chwola’diminłung-miwah-na:xohk’it")
+      , (58, "chwola’diminłung-miwah-na:ke:nim")
+      , (59, "chwola’diminłung-miwah-na:miq’os-t’aw")
+      , (60, "xosta:ndiminłung")
+      , (61, "xosta:ndiminłung-miwah-na:ła’")
+      , (62, "xosta:ndiminłung-miwah-na:nahx")
+      , (63, "xosta:ndiminłung-miwah-na:ta:q’")
+      , (64, "xosta:ndiminłung-miwah-na:dink’")
+      , (65, "xosta:ndiminłung-miwah-na:chwola’")
+      , (66, "xosta:ndiminłung-miwah-na:xosta:n")
+      , (67, "xosta:ndiminłung-miwah-na:xohk’it")
+      , (68, "xosta:ndiminłung-miwah-na:ke:nim")
+      , (69, "xosta:ndiminłung-miwah-na:miq’os-t’aw")
+      , (70, "xohk’e:diminłung")
+      , (71, "xohk’e:diminłung-miwah-na:ła’")
+      , (72, "xohk’e:diminłung-miwah-na:nahx")
+      , (73, "xohk’e:diminłung-miwah-na:ta:q’")
+      , (74, "xohk’e:diminłung-miwah-na:dink’")
+      , (75, "xohk’e:diminłung-miwah-na:chwola’")
+      , (76, "xohk’e:diminłung-miwah-na:xosta:n")
+      , (77, "xohk’e:diminłung-miwah-na:xohk’it")
+      , (78, "xohk’e:diminłung-miwah-na:ke:nim")
+      , (79, "xohk’e:diminłung-miwah-na:miq’os-t’aw")
+      , (80, "ke:nimdiminłung")
+      , (81, "ke:nimdiminłung-miwah-na:ła’")
+      , (82, "ke:nimdiminłung-miwah-na:nahx")
+      , (83, "ke:nimdiminłung-miwah-na:ta:q’")
+      , (84, "ke:nimdiminłung-miwah-na:dink’")
+      , (85, "ke:nimdiminłung-miwah-na:chwola’")
+      , (86, "ke:nimdiminłung-miwah-na:xosta:n")
+      , (87, "ke:nimdiminłung-miwah-na:xohk’it")
+      , (88, "ke:nimdiminłung-miwah-na:ke:nim")
+      , (89, "ke:nimdiminłung-miwah-na:miq’os-t’aw")
+      , (90, "miq’ost’ahdiminłung")
+      , (91, "miq’ost’ahdiminłung-miwah-na:ła’")
+      , (92, "miq’ost’ahdiminłung-miwah-na:nahx")
+      , (93, "miq’ost’ahdiminłung-miwah-na:ta:q’")
+      , (94, "miq’ost’ahdiminłung-miwah-na:dink’")
+      , (95, "miq’ost’ahdiminłung-miwah-na:chwola’")
+      , (96, "miq’ost’ahdiminłung-miwah-na:xosta:n")
+      , (97, "miq’ost’ahdiminłung-miwah-na:xohk’it")
+      , (98, "miq’ost’ahdiminłung-miwah-na:ke:nim")
+      , (99, "miq’ost’ahdiminłung-miwah-na:miq’os-t’aw")
+      , (100, "ła’-dikin")
+      , (101, "ła’-dikin-miwah-na:ła’")
+      , (102, "ła’-dikin-miwah-na:nahx")
+      , (103, "ła’-dikin-miwah-na:ta:q’")
+      , (104, "ła’-dikin-miwah-na:dink’")
+      , (105, "ła’-dikin-miwah-na:chwola’")
+      , (106, "ła’-dikin-miwah-na:xosta:n")
+      , (107, "ła’-dikin-miwah-na:xohk’it")
+      , (108, "ła’-dikin-miwah-na:ke:nim")
+      , (109, "ła’-dikin-miwah-na:miq’os-t’aw")
+      , (110, "ła’-dikin-miwah-na:minłung")
+      , (123, "ła’-dikin-miwah-na:nahdiminłung-miwah-na:ta:q’")
+      , (200, "nahx-dikin")
+      , (300, "ta:q’i-dikin")
+      , (321, "ta:q’-dikin-miwah-na:nahdiminłung-miwah-na:ła’")
+      , (400, "dink’i-dikin")
+      , (500, "chwola’-dikin")
+      , (600, "xosta:n-dikin")
+      , (700, "xohk’e-dikin")
+      , (800, "ke:nim-dikin")
+      , (900, "miq’ost’ah-dikin")
+      , (909, "miq’os-t’aw-dikin-miwah-na:miq’os-t’aw")
+      , (990, "miq’os-t’aw-dikin-miwah-na:miq’ost’ahdiminłung")
+      , (999, "miq’os-t’aw-dikin-miwah-na:miq’ost’ahdiminłung-miwah-na:miq’os-t’aw")
+      , (1000, "minłun-dikin")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/HUR/TestData.hs b/src-test/Text/Numeral/Language/HUR/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/HUR/TestData.hs
@@ -0,0 +1,149 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        hur
+
+[@Native name@]     Halq̓eméylem, Hul̓q̓umín̓um̓, Hun'qumi'num
+
+[@English name@]    Halkomelem
+-}
+module Text.Numeral.Language.HUR.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-halkomelem/en/hur/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "nuts’a’")
+      , (2, "yuse’lu")
+      , (3, "lhihw")
+      , (4, "xu’athun")
+      , (5, "lhq’etsus")
+      , (6, "t’xum")
+      , (7, "tth’a’kwus")
+      , (8, "te’tsus")
+      , (9, "toohw")
+      , (10, "’apun")
+      , (11, "’apun ’i’ kw’ nuts’a’")
+      , (12, "’apun ’i’ kw’ yuse’lu")
+      , (13, "’apun ’i’ kw’ lhihw")
+      , (14, "’apun ’i’ kw’ xu’athun")
+      , (15, "’apun ’i’ kw’ lhq’etsus")
+      , (16, "’apun ’i’ kw’ t’xum")
+      , (17, "’apun ’i’ kw’ tth’a’kwus")
+      , (18, "’apun ’i’ kw’ te’tsus")
+      , (19, "’apun ’i’ kw’ toohw")
+      , (20, "tskw’ush")
+      , (21, "tskw’ush ’i’ kw’ nuts’a’")
+      , (22, "tskw’ush ’i’ kw’ yuse’lu")
+      , (23, "tskw’ush ’i’ kw’ lhihw")
+      , (24, "tskw’ush ’i’ kw’ xu’athun")
+      , (25, "tskw’ush ’i’ kw’ lhq’etsus")
+      , (26, "tskw’ush ’i’ kw’ t’xum")
+      , (27, "tskw’ush ’i’ kw’ tth’a’kwus")
+      , (28, "tskw’ush ’i’ kw’ te’tsus")
+      , (29, "tskw’ush ’i’ kw’ toohw")
+      , (30, "lhuhwulhshe’")
+      , (31, "lhuhwulhshe’ ’i’ kw’ nuts’a’")
+      , (32, "lhuhwulhshe’ ’i’ kw’ yuse’lu")
+      , (33, "lhuhwulhshe’ ’i’ kw’ lhihw")
+      , (34, "lhuhwulhshe’ ’i’ kw’ xu’athun")
+      , (35, "lhuhwulhshe’ ’i’ kw’ lhq’etsus")
+      , (36, "lhuhwulhshe’ ’i’ kw’ t’xum")
+      , (37, "lhuhwulhshe’ ’i’ kw’ tth’a’kwus")
+      , (38, "lhuhwulhshe’ ’i’ kw’ te’tsus")
+      , (39, "lhuhwulhshe’ ’i’ kw’ toohw")
+      , (40, "xuthunlhshe’")
+      , (41, "xuthunlhshe’ ’i’ kw’ nuts’a’")
+      , (42, "xuthunlhshe’ ’i’ kw’ yuse’lu")
+      , (43, "xuthunlhshe’ ’i’ kw’ lhihw")
+      , (44, "xuthunlhshe’ ’i’ kw’ xu’athun")
+      , (45, "xuthunlhshe’ ’i’ kw’ lhq’etsus")
+      , (46, "xuthunlhshe’ ’i’ kw’ t’xum")
+      , (47, "xuthunlhshe’ ’i’ kw’ tth’a’kwus")
+      , (48, "xuthunlhshe’ ’i’ kw’ te’tsus")
+      , (49, "xuthunlhshe’ ’i’ kw’ toohw")
+      , (50, "lhq’utssulhshe’")
+      , (51, "lhq’utssulhshe’ ’i’ kw’ nuts’a’")
+      , (52, "lhq’utssulhshe’ ’i’ kw’ yuse’lu")
+      , (53, "lhq’utssulhshe’ ’i’ kw’ lhihw")
+      , (54, "lhq’utssulhshe’ ’i’ kw’ xu’athun")
+      , (55, "lhq’utssulhshe’ ’i’ kw’ lhq’etsus")
+      , (56, "lhq’utssulhshe’ ’i’ kw’ t’xum")
+      , (57, "lhq’utssulhshe’ ’i’ kw’ tth’a’kwus")
+      , (58, "lhq’utssulhshe’ ’i’ kw’ te’tsus")
+      , (59, "lhq’utssulhshe’ ’i’ kw’ toohw")
+      , (60, "t’xumulhshe’")
+      , (61, "t’xumulhshe’ ’i’ kw’ nuts’a’")
+      , (62, "t’xumulhshe’ ’i’ kw’ yuse’lu")
+      , (63, "t’xumulhshe’ ’i’ kw’ lhihw")
+      , (64, "t’xumulhshe’ ’i’ kw’ xu’athun")
+      , (65, "t’xumulhshe’ ’i’ kw’ lhq’etsus")
+      , (66, "t’xumulhshe’ ’i’ kw’ t’xum")
+      , (67, "t’xumulhshe’ ’i’ kw’ tth’a’kwus")
+      , (68, "t’xumulhshe’ ’i’ kw’ te’tsus")
+      , (69, "t’xumulhshe’ ’i’ kw’ toohw")
+      , (70, "tth’ukwsulhshe’")
+      , (71, "tth’ukwsulhshe’ ’i’ kw’ nuts’a’")
+      , (72, "tth’ukwsulhshe’ ’i’ kw’ yuse’lu")
+      , (73, "tth’ukwsulhshe’ ’i’ kw’ lhihw")
+      , (74, "tth’ukwsulhshe’ ’i’ kw’ xu’athun")
+      , (75, "tth’ukwsulhshe’ ’i’ kw’ lhq’etsus")
+      , (76, "tth’ukwsulhshe’ ’i’ kw’ t’xum")
+      , (77, "tth’ukwsulhshe’ ’i’ kw’ tth’a’kwus")
+      , (78, "tth’ukwsulhshe’ ’i’ kw’ te’tsus")
+      , (79, "tth’ukwsulhshe’ ’i’ kw’ toohw")
+      , (80, "tutssulhshe’")
+      , (81, "tutssulhshe’ ’i’ kw’ nuts’a’")
+      , (82, "tutssulhshe’ ’i’ kw’ yuse’lu")
+      , (83, "tutssulhshe’ ’i’ kw’ lhihw")
+      , (84, "tutssulhshe’ ’i’ kw’ xu’athun")
+      , (85, "tutssulhshe’ ’i’ kw’ lhq’etsus")
+      , (86, "tutssulhshe’ ’i’ kw’ t’xum")
+      , (87, "tutssulhshe’ ’i’ kw’ tth’a’kwus")
+      , (88, "tutssulhshe’ ’i’ kw’ te’tsus")
+      , (89, "tutssulhshe’ ’i’ kw’ toohw")
+      , (90, "toohwulhshe’")
+      , (91, "toohwulhshe’ ’i’ kw’ nuts’a’")
+      , (92, "toohwulhshe’ ’i’ kw’ yuse’lu")
+      , (93, "toohwulhshe’ ’i’ kw’ lhihw")
+      , (94, "toohwulhshe’ ’i’ kw’ xu’athun")
+      , (95, "toohwulhshe’ ’i’ kw’ lhq’etsus")
+      , (96, "toohwulhshe’ ’i’ kw’ t’xum")
+      , (97, "toohwulhshe’ ’i’ kw’ tth’a’kwus")
+      , (98, "toohwulhshe’ ’i’ kw’ te’tsus")
+      , (99, "toohwulhshe’ ’i’ kw’ toohw")
+      , (100, "nets’uwuts")
+      , (101, "nets’uwuts ’i’ kw’ nuts’a’")
+      , (102, "nets’uwuts ’i’ kw’ yuse’lu")
+      , (103, "nets’uwuts ’i’ kw’ lhihw")
+      , (104, "nets’uwuts ’i’ kw’ xu’athun")
+      , (105, "nets’uwuts ’i’ kw’ lhq’etsus")
+      , (106, "nets’uwuts ’i’ kw’ t’xum")
+      , (107, "nets’uwuts ’i’ kw’ tth’a’kwus")
+      , (108, "nets’uwuts ’i’ kw’ te’tsus")
+      , (109, "nets’uwuts ’i’ kw’ toohw")
+      , (110, "nets’uwuts ’i’ kw’ ’apun")
+      , (123, "nets’uwuts ’i’ kw’ tskw’ush ’i’ kw’ lhihw")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/HY/TestData.hs b/src-test/Text/Numeral/Language/HY/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/HY/TestData.hs
+++ /dev/null
@@ -1,208 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        hy
-
-[@ISO639-2B@]       arm
-
-[@ISO639-2T@]       hye
-
-[@ISO639-3@]        hye
-
-[@Native name@]     հայերեն
-
-[@English name@]    Armenian
--}
-module Text.Numeral.Language.HY.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-armenian/en/hye/
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "զրո")
-      , (1, "մեկ")
-      , (2, "երկու")
-      , (3, "երեք")
-      , (4, "չորս")
-      , (5, "հինգ")
-      , (6, "վեց")
-      , (7, "յոթ")
-      , (8, "ութ")
-      , (9, "ինը")
-      , (10, "տաս")
-      , (11, "տասնմեկ")
-      , (12, "տասներկու")
-      , (13, "տասներեք")
-      , (14, "տասնչորս")
-      , (15, "տասնհինգ")
-      , (16, "տասնվեց")
-      , (17, "տասնյոթ")
-      , (18, "տասնութ")
-      , (19, "տասնինը")
-      , (20, "քսան")
-      , (21, "քսան մեկ")
-      , (22, "քսան երկու")
-      , (23, "քսան երեք")
-      , (24, "քսան չորս")
-      , (25, "քսան հինգ")
-      , (26, "քսան վեց")
-      , (27, "քսան յոթ")
-      , (28, "քսան ութ")
-      , (29, "քսան ինը")
-      , (30, "երեսուն")
-      , (31, "երեսուն մեկ")
-      , (32, "երեսուն երկու")
-      , (33, "երեսուն երեք")
-      , (34, "երեսուն չորս")
-      , (35, "երեսուն հինգ")
-      , (36, "երեսուն վեց")
-      , (37, "երեսուն յոթ")
-      , (38, "երեսուն ութ")
-      , (39, "երեսուն ինը")
-      , (40, "քառասուն")
-      , (41, "քառասուն մեկ")
-      , (42, "քառասուն երկու")
-      , (43, "քառասուն երեք")
-      , (44, "քառասուն չորս")
-      , (45, "քառասուն հինգ")
-      , (46, "քառասուն վեց")
-      , (47, "քառասուն յոթ")
-      , (48, "քառասուն ութ")
-      , (49, "քառասուն ինը")
-      , (50, "հիսուն")
-      , (51, "հիսուն մեկ")
-      , (52, "հիսուն երկու")
-      , (53, "հիսուն երեք")
-      , (54, "հիսուն չորս")
-      , (55, "հիսուն հինգ")
-      , (56, "հիսուն վեց")
-      , (57, "հիսուն յոթ")
-      , (58, "հիսուն ութ")
-      , (59, "հիսուն ինը")
-      , (60, "վաթսուն")
-      , (61, "վաթսուն մեկ")
-      , (62, "վաթսուն երկու")
-      , (63, "վաթսուն երեք")
-      , (64, "վաթսուն չորս")
-      , (65, "վաթսուն հինգ")
-      , (66, "վաթսուն վեց")
-      , (67, "վաթսուն յոթ")
-      , (68, "վաթսուն ութ")
-      , (69, "վաթսուն ինը")
-      , (70, "յոթանասուն")
-      , (71, "յոթանասուն մեկ")
-      , (72, "յոթանասուն երկու")
-      , (73, "յոթանասուն երեք")
-      , (74, "յոթանասուն չորս")
-      , (75, "յոթանասուն հինգ")
-      , (76, "յոթանասուն վեց")
-      , (77, "յոթանասուն յոթ")
-      , (78, "յոթանասուն ութ")
-      , (79, "յոթանասուն ինը")
-      , (80, "ութսուն")
-      , (81, "ութսուն մեկ")
-      , (82, "ութսուն երկու")
-      , (83, "ութսուն երեք")
-      , (84, "ութսուն չորս")
-      , (85, "ութսուն հինգ")
-      , (86, "ութսուն վեց")
-      , (87, "ութսուն յոթ")
-      , (88, "ութսուն ութ")
-      , (89, "ութսուն ինը")
-      , (90, "իննսուն")
-      , (91, "իննսուն մեկ")
-      , (92, "իննսուն երկու")
-      , (93, "իննսուն երեք")
-      , (94, "իննսուն չորս")
-      , (95, "իննսուն հինգ")
-      , (96, "իննսուն վեց")
-      , (97, "իննսուն յոթ")
-      , (98, "իննսուն ութ")
-      , (99, "իննսուն ինը")
-      , (100, "հարյուր")
-      , (101, "հարյուր մեկ")
-      , (102, "հարյուր երկու")
-      , (103, "հարյուր երեք")
-      , (104, "հարյուր չորս")
-      , (105, "հարյուր հինգ")
-      , (106, "հարյուր վեց")
-      , (107, "հարյուր յոթ")
-      , (108, "հարյուր ութ")
-      , (109, "հարյուր ինը")
-      , (110, "հարյուր տաս")
-      , (123, "հարյուր քսան երեք")
-      , (200, "երկու հարյուր")
-      , (300, "երեք հարյուր")
-      , (321, "երեք հարյուր քսան մեկ")
-      , (400, "չորս հարյուր")
-      , (500, "հինգ հարյուր")
-      , (600, "վեց հարյուր")
-      , (700, "յոթ հարյուր")
-      , (800, "ութ հարյուր")
-      , (900, "ինը հարյուր")
-      , (909, "ինը հարյուր ինը")
-      , (990, "ինը հարյուր իննսուն")
-      , (999, "ինը հարյուր իննսուն ինը")
-      , (1000, "հազար")
-      , (1001, "հազար մեկ")
-      , (1008, "հազար ութ")
-      , (1234, "հազար երկու հարյուր երեսուն չորս")
-      , (2000, "երկու հազար")
-      , (3000, "երեք հազար")
-      , (4000, "չորս հազար")
-      , (4321, "չորս հազար երեք հարյուր քսան մեկ")
-      , (5000, "հինգ հազար")
-      , (6000, "վեց հազար")
-      , (7000, "յոթ հազար")
-      , (8000, "ութ հազար")
-      , (9000, "ինը հազար")
-      , (10000, "տաս հազար")
-      , (12345, "տասներկու հազար երեք հարյուր քառասուն հինգ")
-      , (20000, "քսան հազար")
-      , (30000, "երեսուն հազար")
-      , (40000, "քառասուն հազար")
-      , (50000, "հիսուն հազար")
-      , (54321, "հիսուն չորս հազար երեք հարյուր քսան մեկ")
-      , (60000, "վաթսուն հազար")
-      , (70000, "յոթանասուն հազար")
-      , (80000, "ութսուն հազար")
-      , (90000, "իննսուն հազար")
-      , (100000, "հարյուր հազար")
-      , (123456, "հարյուր քսան երեք հազար չորս հարյուր հիսուն վեց")
-      , (200000, "երկու հարյուր հազար")
-      , (300000, "երեք հարյուր հազար")
-      , (400000, "չորս հարյուր հազար")
-      , (500000, "հինգ հարյուր հազար")
-      , (600000, "վեց հարյուր հազար")
-      , (654321, "վեց հարյուր հիսուն չորս հազար երեք հարյուր քսան մեկ")
-      , (700000, "յոթ հարյուր հազար")
-      , (800000, "ութ հարյուր հազար")
-      , (900000, "ինը հարյուր հազար")
-      , (1000000, "միլիոն")
-      , (1000000000, "միլիարդ")
-      , (1000000000000, "տրիլիոն")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/HYE/TestData.hs b/src-test/Text/Numeral/Language/HYE/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/HYE/TestData.hs
@@ -0,0 +1,202 @@
+{-|
+[@ISO639-1@]        hy
+
+[@ISO639-2B@]       arm
+
+[@ISO639-2T@]       hye
+
+[@ISO639-3@]        hye
+
+[@Native name@]     հայերեն
+
+[@English name@]    Armenian
+-}
+module Text.Numeral.Language.HYE.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-armenian/en/hye/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "զրո")
+      , (1, "մեկ")
+      , (2, "երկու")
+      , (3, "երեք")
+      , (4, "չորս")
+      , (5, "հինգ")
+      , (6, "վեց")
+      , (7, "յոթ")
+      , (8, "ութ")
+      , (9, "ինը")
+      , (10, "տաս")
+      , (11, "տասնմեկ")
+      , (12, "տասներկու")
+      , (13, "տասներեք")
+      , (14, "տասնչորս")
+      , (15, "տասնհինգ")
+      , (16, "տասնվեց")
+      , (17, "տասնյոթ")
+      , (18, "տասնութ")
+      , (19, "տասնինը")
+      , (20, "քսան")
+      , (21, "քսան մեկ")
+      , (22, "քսան երկու")
+      , (23, "քսան երեք")
+      , (24, "քսան չորս")
+      , (25, "քսան հինգ")
+      , (26, "քսան վեց")
+      , (27, "քսան յոթ")
+      , (28, "քսան ութ")
+      , (29, "քսան ինը")
+      , (30, "երեսուն")
+      , (31, "երեսուն մեկ")
+      , (32, "երեսուն երկու")
+      , (33, "երեսուն երեք")
+      , (34, "երեսուն չորս")
+      , (35, "երեսուն հինգ")
+      , (36, "երեսուն վեց")
+      , (37, "երեսուն յոթ")
+      , (38, "երեսուն ութ")
+      , (39, "երեսուն ինը")
+      , (40, "քառասուն")
+      , (41, "քառասուն մեկ")
+      , (42, "քառասուն երկու")
+      , (43, "քառասուն երեք")
+      , (44, "քառասուն չորս")
+      , (45, "քառասուն հինգ")
+      , (46, "քառասուն վեց")
+      , (47, "քառասուն յոթ")
+      , (48, "քառասուն ութ")
+      , (49, "քառասուն ինը")
+      , (50, "հիսուն")
+      , (51, "հիսուն մեկ")
+      , (52, "հիսուն երկու")
+      , (53, "հիսուն երեք")
+      , (54, "հիսուն չորս")
+      , (55, "հիսուն հինգ")
+      , (56, "հիսուն վեց")
+      , (57, "հիսուն յոթ")
+      , (58, "հիսուն ութ")
+      , (59, "հիսուն ինը")
+      , (60, "վաթսուն")
+      , (61, "վաթսուն մեկ")
+      , (62, "վաթսուն երկու")
+      , (63, "վաթսուն երեք")
+      , (64, "վաթսուն չորս")
+      , (65, "վաթսուն հինգ")
+      , (66, "վաթսուն վեց")
+      , (67, "վաթսուն յոթ")
+      , (68, "վաթսուն ութ")
+      , (69, "վաթսուն ինը")
+      , (70, "յոթանասուն")
+      , (71, "յոթանասուն մեկ")
+      , (72, "յոթանասուն երկու")
+      , (73, "յոթանասուն երեք")
+      , (74, "յոթանասուն չորս")
+      , (75, "յոթանասուն հինգ")
+      , (76, "յոթանասուն վեց")
+      , (77, "յոթանասուն յոթ")
+      , (78, "յոթանասուն ութ")
+      , (79, "յոթանասուն ինը")
+      , (80, "ութսուն")
+      , (81, "ութսուն մեկ")
+      , (82, "ութսուն երկու")
+      , (83, "ութսուն երեք")
+      , (84, "ութսուն չորս")
+      , (85, "ութսուն հինգ")
+      , (86, "ութսուն վեց")
+      , (87, "ութսուն յոթ")
+      , (88, "ութսուն ութ")
+      , (89, "ութսուն ինը")
+      , (90, "իննսուն")
+      , (91, "իննսուն մեկ")
+      , (92, "իննսուն երկու")
+      , (93, "իննսուն երեք")
+      , (94, "իննսուն չորս")
+      , (95, "իննսուն հինգ")
+      , (96, "իննսուն վեց")
+      , (97, "իննսուն յոթ")
+      , (98, "իննսուն ութ")
+      , (99, "իննսուն ինը")
+      , (100, "հարյուր")
+      , (101, "հարյուր մեկ")
+      , (102, "հարյուր երկու")
+      , (103, "հարյուր երեք")
+      , (104, "հարյուր չորս")
+      , (105, "հարյուր հինգ")
+      , (106, "հարյուր վեց")
+      , (107, "հարյուր յոթ")
+      , (108, "հարյուր ութ")
+      , (109, "հարյուր ինը")
+      , (110, "հարյուր տաս")
+      , (123, "հարյուր քսան երեք")
+      , (200, "երկու հարյուր")
+      , (300, "երեք հարյուր")
+      , (321, "երեք հարյուր քսան մեկ")
+      , (400, "չորս հարյուր")
+      , (500, "հինգ հարյուր")
+      , (600, "վեց հարյուր")
+      , (700, "յոթ հարյուր")
+      , (800, "ութ հարյուր")
+      , (900, "ինը հարյուր")
+      , (909, "ինը հարյուր ինը")
+      , (990, "ինը հարյուր իննսուն")
+      , (999, "ինը հարյուր իննսուն ինը")
+      , (1000, "հազար")
+      , (1001, "հազար մեկ")
+      , (1008, "հազար ութ")
+      , (1234, "հազար երկու հարյուր երեսուն չորս")
+      , (2000, "երկու հազար")
+      , (3000, "երեք հազար")
+      , (4000, "չորս հազար")
+      , (4321, "չորս հազար երեք հարյուր քսան մեկ")
+      , (5000, "հինգ հազար")
+      , (6000, "վեց հազար")
+      , (7000, "յոթ հազար")
+      , (8000, "ութ հազար")
+      , (9000, "ինը հազար")
+      , (10000, "տաս հազար")
+      , (12345, "տասներկու հազար երեք հարյուր քառասուն հինգ")
+      , (20000, "քսան հազար")
+      , (30000, "երեսուն հազար")
+      , (40000, "քառասուն հազար")
+      , (50000, "հիսուն հազար")
+      , (54321, "հիսուն չորս հազար երեք հարյուր քսան մեկ")
+      , (60000, "վաթսուն հազար")
+      , (70000, "յոթանասուն հազար")
+      , (80000, "ութսուն հազար")
+      , (90000, "իննսուն հազար")
+      , (100000, "հարյուր հազար")
+      , (123456, "հարյուր քսան երեք հազար չորս հարյուր հիսուն վեց")
+      , (200000, "երկու հարյուր հազար")
+      , (300000, "երեք հարյուր հազար")
+      , (400000, "չորս հարյուր հազար")
+      , (500000, "հինգ հարյուր հազար")
+      , (600000, "վեց հարյուր հազար")
+      , (654321, "վեց հարյուր հիսուն չորս հազար երեք հարյուր քսան մեկ")
+      , (700000, "յոթ հարյուր հազար")
+      , (800000, "ութ հարյուր հազար")
+      , (900000, "ինը հարյուր հազար")
+      , (1000000, "միլիոն")
+      , (1000000000, "միլիարդ")
+      , (1000000000000, "տրիլիոն")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/IBO/TestData.hs b/src-test/Text/Numeral/Language/IBO/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/IBO/TestData.hs
@@ -0,0 +1,219 @@
+{-|
+[@ISO639-1@]        ig
+
+[@ISO639-2@]        ibo
+
+[@ISO639-3@]        ibo
+
+[@Native name@]     Asụsụ Igbo
+
+[@English name@]    Igbo
+-}
+module Text.Numeral.Language.IBO.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-igbo/en/ibo/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "adigi")
+      , (1, "otu")
+      , (2, "abụọ")
+      , (3, "atọ")
+      , (4, "anọ")
+      , (5, "ise")
+      , (6, "isii")
+      , (7, "asaa")
+      , (8, "asato")
+      , (9, "eteghiete")
+      , (10, "iri")
+      , (11, "iri na otu")
+      , (12, "iri na abụọ")
+      , (13, "iri na atọ")
+      , (14, "iri na anọ")
+      , (15, "iri na ise")
+      , (16, "iri na isii")
+      , (17, "iri na asaa")
+      , (18, "iri na asato")
+      , (19, "iri na eteghiete")
+      , (20, "iri abụọ")
+      , (21, "iri abụọ na otu")
+      , (22, "iri abụọ na abụọ")
+      , (23, "iri abụọ na atọ")
+      , (24, "iri abụọ na anọ")
+      , (25, "iri abụọ na ise")
+      , (26, "iri abụọ na isii")
+      , (27, "iri abụọ na asaa")
+      , (28, "iri abụọ na asato")
+      , (29, "iri abụọ na eteghiete")
+      , (30, "iri atọ")
+      , (31, "iri atọ na otu")
+      , (32, "iri atọ na abụọ")
+      , (33, "iri atọ na atọ")
+      , (34, "iri atọ na anọ")
+      , (35, "iri atọ na ise")
+      , (36, "iri atọ na isii")
+      , (37, "iri atọ na asaa")
+      , (38, "iri atọ na asato")
+      , (39, "iri atọ na eteghiete")
+      , (40, "iri anọ")
+      , (41, "iri anọ na otu")
+      , (42, "iri anọ na abụọ")
+      , (43, "iri anọ na atọ")
+      , (44, "iri anọ na anọ")
+      , (45, "iri anọ na ise")
+      , (46, "iri anọ na isii")
+      , (47, "iri anọ na asaa")
+      , (48, "iri anọ na asato")
+      , (49, "iri anọ na eteghiete")
+      , (50, "iri ise")
+      , (51, "iri ise na otu")
+      , (52, "iri ise na abụọ")
+      , (53, "iri ise na atọ")
+      , (54, "iri ise na anọ")
+      , (55, "iri ise na ise")
+      , (56, "iri ise na isii")
+      , (57, "iri ise na asaa")
+      , (58, "iri ise na asato")
+      , (59, "iri ise na eteghiete")
+      , (60, "iri isii")
+      , (61, "iri isii na otu")
+      , (62, "iri isii na abụọ")
+      , (63, "iri isii na atọ")
+      , (64, "iri isii na anọ")
+      , (65, "iri isii na ise")
+      , (66, "iri isii na isii")
+      , (67, "iri isii na asaa")
+      , (68, "iri isii na asato")
+      , (69, "iri isii na eteghiete")
+      , (70, "iri asaa")
+      , (71, "iri asaa na otu")
+      , (72, "iri asaa na abụọ")
+      , (73, "iri asaa na atọ")
+      , (74, "iri asaa na anọ")
+      , (75, "iri asaa na ise")
+      , (76, "iri asaa na isii")
+      , (77, "iri asaa na asaa")
+      , (78, "iri asaa na asato")
+      , (79, "iri asaa na eteghiete")
+      , (80, "iri asato")
+      , (81, "iri asato na otu")
+      , (82, "iri asato na abụọ")
+      , (83, "iri asato na atọ")
+      , (84, "iri asato na anọ")
+      , (85, "iri asato na ise")
+      , (86, "iri asato na isii")
+      , (87, "iri asato na asaa")
+      , (88, "iri asato na asato")
+      , (89, "iri asato na eteghiete")
+      , (90, "iri eteghiete")
+      , (91, "iri eteghiete na otu")
+      , (92, "iri eteghiete na abụọ")
+      , (93, "iri eteghiete na atọ")
+      , (94, "iri eteghiete na anọ")
+      , (95, "iri eteghiete na ise")
+      , (96, "iri eteghiete na isii")
+      , (97, "iri eteghiete na asaa")
+      , (98, "iri eteghiete na asato")
+      , (99, "iri eteghiete na eteghiete")
+      , (100, "nnari")
+      , (101, "nnari na otu")
+      , (102, "nnari na abụọ")
+      , (103, "nnari na atọ")
+      , (104, "nnari na anọ")
+      , (105, "nnari na ise")
+      , (106, "nnari na isii")
+      , (107, "nnari na asaa")
+      , (108, "nnari na asato")
+      , (109, "nnari na eteghiete")
+      , (110, "nnari na iri")
+      , (123, "nnari na iri abụọ na atọ")
+      , (200, "nnari abụọ")
+      , (300, "nnari atọ")
+      , (321, "nnari atọ na iri abụọ na otu")
+      , (400, "nnari anọ")
+      , (500, "nnari ise")
+      , (600, "nnari isii")
+      , (700, "nnari asaa")
+      , (800, "nnari asato")
+      , (900, "nnari eteghiete")
+      , (909, "nnari eteghiete na eteghiete")
+      , (990, "nnari eteghiete na iri eteghiete")
+      , (999, "nnari eteghiete na iri eteghiete na eteghiete")
+      , (1000, "puku")
+      , (1001, "puku na otu")
+      , (1008, "puku na asato")
+      , (1234, "puku na nnari abụọ na iri atọ na anọ")
+      , (2000, "puku abụọ")
+      , (3000, "puku atọ")
+      , (4000, "puku anọ")
+      , (4321, "puku anọ na nnari atọ na iri abụọ na otu")
+      , (5000, "puku ise")
+      , (6000, "puku isii")
+      , (7000, "puku asaa")
+      , (8000, "puku asato")
+      , (9000, "puku eteghiete")
+      , (10000, "iri puku")
+      , (12345, "iri na puku abụọ na nnari atọ na iri anọ na ise")
+      , (20000, "iri puku abụọ")
+      , (30000, "iri puku atọ")
+      , (40000, "iri puku anọ")
+      , (50000, "iri puku ise")
+      , (54321, "iri ise na puku anọ na nnari atọ na iri abụọ na otu")
+      , (60000, "iri puku isii")
+      , (70000, "iri puku asaa")
+      , (80000, "iri puku asato")
+      , (90000, "iri puku eteghiete")
+      , (100000, "nnari puku")
+      , (123456, "nnari na iri abụọ na puku atọ na nnari anọ na iri ise na isii")
+      , (200000, "nnari abụọ puku")
+      , (300000, "nnari atọ puku")
+      , (400000, "nnari anọ puku")
+      , (500000, "nnari ise puku")
+      , (600000, "nnari isii puku")
+      , (654321, "nnari isii na iri ise na puku anọ na nnari atọ na iri abụọ na otu")
+      , (700000, "nnari asaa puku")
+      , (800000, "nnari asato puku")
+      , (900000, "nnari eteghiete puku")
+      , (1000000, "nde")
+      , (1000001, "nde na otu")
+      , (1234567, "nde na nnari abụọ na iri atọ na puku anọ na nnari ise na iri isii na asaa")
+      , (2000000, "nde abụọ")
+      , (3000000, "nde atọ")
+      , (4000000, "nde anọ")
+      , (5000000, "nde ise")
+      , (6000000, "nde isii")
+      , (7000000, "nde asaa")
+      , (7654321, "nde asaa na nnari isii na iri ise na puku anọ na nnari atọ na iri abụọ na otu")
+      , (8000000, "nde asato")
+      , (9000000, "nde eteghiete")
+      , (1000000000, "ijeri")
+      , (1000000001, "ijeri na otu")
+      , (2000000000, "ijeri abụọ")
+      , (3000000000, "ijeri atọ")
+      , (4000000000, "ijeri anọ")
+      , (5000000000, "ijeri ise")
+      , (6000000000, "ijeri isii")
+      , (7000000000, "ijeri asaa")
+      , (8000000000, "ijeri asato")
+      , (9000000000, "ijeri eteghiete")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/IND/TestData.hs b/src-test/Text/Numeral/Language/IND/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/IND/TestData.hs
@@ -0,0 +1,229 @@
+{-|
+[@ISO639-1@]        id
+
+[@ISO639-2@]        ind
+
+[@ISO639-3@]        ind
+
+[@Native name@]     Bahasa Indonesia
+
+[@English name@]    Indonesian
+-}
+module Text.Numeral.Language.IND.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-indonesian/en/ind/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "kosong")
+      , (1, "satu")
+      , (2, "dua")
+      , (3, "tiga")
+      , (4, "empat")
+      , (5, "lima")
+      , (6, "enam")
+      , (7, "tujuh")
+      , (8, "delapan")
+      , (9, "sembilan")
+      , (10, "sepuluh")
+      , (11, "sebelas")
+      , (12, "dua belas")
+      , (13, "tiga belas")
+      , (14, "empat belas")
+      , (15, "lima belas")
+      , (16, "enam belas")
+      , (17, "tujuh belas")
+      , (18, "delapan belas")
+      , (19, "sembilan belas")
+      , (20, "dua puluh")
+      , (21, "dua puluh satu")
+      , (22, "dua puluh dua")
+      , (23, "dua puluh tiga")
+      , (24, "dua puluh empat")
+      , (25, "dua puluh lima")
+      , (26, "dua puluh enam")
+      , (27, "dua puluh tujuh")
+      , (28, "dua puluh delapan")
+      , (29, "dua puluh sembilan")
+      , (30, "tiga puluh")
+      , (31, "tiga puluh satu")
+      , (32, "tiga puluh dua")
+      , (33, "tiga puluh tiga")
+      , (34, "tiga puluh empat")
+      , (35, "tiga puluh lima")
+      , (36, "tiga puluh enam")
+      , (37, "tiga puluh tujuh")
+      , (38, "tiga puluh delapan")
+      , (39, "tiga puluh sembilan")
+      , (40, "empat puluh")
+      , (41, "empat puluh satu")
+      , (42, "empat puluh dua")
+      , (43, "empat puluh tiga")
+      , (44, "empat puluh empat")
+      , (45, "empat puluh lima")
+      , (46, "empat puluh enam")
+      , (47, "empat puluh tujuh")
+      , (48, "empat puluh delapan")
+      , (49, "empat puluh sembilan")
+      , (50, "lima puluh")
+      , (51, "lima puluh satu")
+      , (52, "lima puluh dua")
+      , (53, "lima puluh tiga")
+      , (54, "lima puluh empat")
+      , (55, "lima puluh lima")
+      , (56, "lima puluh enam")
+      , (57, "lima puluh tujuh")
+      , (58, "lima puluh delapan")
+      , (59, "lima puluh sembilan")
+      , (60, "enam puluh")
+      , (61, "enam puluh satu")
+      , (62, "enam puluh dua")
+      , (63, "enam puluh tiga")
+      , (64, "enam puluh empat")
+      , (65, "enam puluh lima")
+      , (66, "enam puluh enam")
+      , (67, "enam puluh tujuh")
+      , (68, "enam puluh delapan")
+      , (69, "enam puluh sembilan")
+      , (70, "tujuh puluh")
+      , (71, "tujuh puluh satu")
+      , (72, "tujuh puluh dua")
+      , (73, "tujuh puluh tiga")
+      , (74, "tujuh puluh empat")
+      , (75, "tujuh puluh lima")
+      , (76, "tujuh puluh enam")
+      , (77, "tujuh puluh tujuh")
+      , (78, "tujuh puluh delapan")
+      , (79, "tujuh puluh sembilan")
+      , (80, "delapan puluh")
+      , (81, "delapan puluh satu")
+      , (82, "delapan puluh dua")
+      , (83, "delapan puluh tiga")
+      , (84, "delapan puluh empat")
+      , (85, "delapan puluh lima")
+      , (86, "delapan puluh enam")
+      , (87, "delapan puluh tujuh")
+      , (88, "delapan puluh delapan")
+      , (89, "delapan puluh sembilan")
+      , (90, "sembilan puluh")
+      , (91, "sembilan puluh satu")
+      , (92, "sembilan puluh dua")
+      , (93, "sembilan puluh tiga")
+      , (94, "sembilan puluh empat")
+      , (95, "sembilan puluh lima")
+      , (96, "sembilan puluh enam")
+      , (97, "sembilan puluh tujuh")
+      , (98, "sembilan puluh delapan")
+      , (99, "sembilan puluh sembilan")
+      , (100, "seratus")
+      , (101, "seratus satu")
+      , (102, "seratus dua")
+      , (103, "seratus tiga")
+      , (104, "seratus empat")
+      , (105, "seratus lima")
+      , (106, "seratus enam")
+      , (107, "seratus tujuh")
+      , (108, "seratus delapan")
+      , (109, "seratus sembilan")
+      , (110, "seratus sepuluh")
+      , (123, "seratus dua puluh tiga")
+      , (200, "dua ratus")
+      , (300, "tiga ratus")
+      , (321, "tiga ratus dua puluh satu")
+      , (400, "empat ratus")
+      , (500, "lima ratus")
+      , (600, "enam ratus")
+      , (700, "tujuh ratus")
+      , (800, "delapan ratus")
+      , (900, "sembilan ratus")
+      , (909, "sembilan ratus sembilan")
+      , (990, "sembilan ratus sembilan puluh")
+      , (999, "sembilan ratus sembilan puluh sembilan")
+      , (1000, "seribu")
+      , (1001, "seribu satu")
+      , (1008, "seribu delapan")
+      , (1234, "seribu dua ratus tiga puluh empat")
+      , (2000, "dua ribu")
+      , (3000, "tiga ribu")
+      , (4000, "empat ribu")
+      , (4321, "empat ribu tiga ratus dua puluh satu")
+      , (5000, "lima ribu")
+      , (6000, "enam ribu")
+      , (7000, "tujuh ribu")
+      , (8000, "delapan ribu")
+      , (9000, "sembilan ribu")
+      , (10000, "sepuluh ribu")
+      , (12345, "belas dua ribu tiga ratus empat puluh lima")
+      , (20000, "dua puluh ribu")
+      , (30000, "tiga puluh ribu")
+      , (40000, "empat puluh ribu")
+      , (50000, "lima puluh ribu")
+      , (54321, "lima puluh empat ribu tiga ratus dua puluh satu")
+      , (60000, "enam puluh ribu")
+      , (70000, "tujuh puluh ribu")
+      , (80000, "delapan puluh ribu")
+      , (90000, "sembilan puluh ribu")
+      , (100000, "seratus ribu")
+      , (123456, "seratus dua puluh tiga ribu empat ratus lima puluh enam")
+      , (200000, "dua ratus ribu")
+      , (300000, "tiga ratus ribu")
+      , (400000, "empat ratus ribu")
+      , (500000, "lima ratus ribu")
+      , (600000, "enam ratus ribu")
+      , (654321, "enam ratus lima puluh empat ribu tiga ratus dua puluh satu")
+      , (700000, "tujuh ratus ribu")
+      , (800000, "delapan ratus ribu")
+      , (900000, "sembilan ratus ribu")
+      , (1000000, "sejuta")
+      , (1000001, "sejuta satu")
+      , (1234567, "sejuta dua ratus tiga puluh empat ribu lima ratus enam puluh tujuh")
+      , (2000000, "dua juta")
+      , (3000000, "tiga juta")
+      , (4000000, "empat juta")
+      , (5000000, "lima juta")
+      , (6000000, "enam juta")
+      , (7000000, "tujuh juta")
+      , (7654321, "tujuh juta enam ratus lima puluh empat ribu tiga ratus dua puluh satu")
+      , (8000000, "delapan juta")
+      , (9000000, "sembilan juta")
+      , (1000000000, "milyar")
+      , (1000000001, "milyar satu")
+      , (2000000000, "dua milyar")
+      , (3000000000, "tiga milyar")
+      , (4000000000, "empat milyar")
+      , (5000000000, "lima milyar")
+      , (6000000000, "enam milyar")
+      , (7000000000, "tujuh milyar")
+      , (8000000000, "delapan milyar")
+      , (9000000000, "sembilan milyar")
+      , (1000000000000, "seribu milyar")
+      , (1000000000001, "seribu milyar satu")
+      , (2000000000000, "dua seribu milyar")
+      , (3000000000000, "tiga seribu milyar")
+      , (4000000000000, "empat seribu milyar")
+      , (5000000000000, "lima seribu milyar")
+      , (6000000000000, "enam seribu milyar")
+      , (7000000000000, "tujuh seribu milyar")
+      , (8000000000000, "delapan seribu milyar")
+      , (9000000000000, "sembilan seribu milyar")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/INH/TestData.hs b/src-test/Text/Numeral/Language/INH/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/INH/TestData.hs
@@ -0,0 +1,218 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        inh
+
+[@ISO639-3@]        inh
+
+[@Native name@]     -
+
+[@English name@]    Ingush
+-}
+module Text.Numeral.Language.INH.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-ingush/en/inh/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "цаI")
+      , (2, "шиъ")
+      , (3, "кхоъ")
+      , (4, "диъ")
+      , (5, "пхиъ")
+      , (6, "ялх")
+      , (7, "ворхI")
+      , (8, "бапхI")
+      , (9, "ийц")
+      , (10, "итт")
+      , (11, "цхьайтта")
+      , (12, "шийтта")
+      , (13, "кхойтта")
+      , (14, "дийтта")
+      , (15, "пхийтта")
+      , (16, "ялхайтта")
+      , (17, "вупийтта")
+      , (18, "бапайтта")
+      , (19, "ткъеста")
+      , (20, "ткъо")
+      , (21, "ткъаь цаI")
+      , (22, "ткъаь шиъ")
+      , (23, "ткъаь кхоъ")
+      , (24, "ткъаь диъ")
+      , (25, "ткъаь пхиъ")
+      , (26, "ткъаь ялх")
+      , (27, "ткъаь ворхI")
+      , (28, "ткъаь бапхI")
+      , (29, "ткъаь ийц")
+      , (30, "ткъаь итт")
+      , (31, "ткъаь цхьайтта")
+      , (32, "ткъаь шийтта")
+      , (33, "ткъаь кхойтта")
+      , (34, "ткъаь дийтта")
+      , (35, "ткъаь пхийтта")
+      , (36, "ткъаь ялхайтта")
+      , (37, "ткъаь вупийтта")
+      , (38, "ткъаь бапайтта")
+      , (39, "ткъаь ткъеста")
+      , (40, "шовэткъа")
+      , (41, "шовэткъе цаI")
+      , (42, "шовэткъе шиъ")
+      , (43, "шовэткъе кхоъ")
+      , (44, "шовэткъе диъ")
+      , (45, "шовэткъе пхиъ")
+      , (46, "шовэткъе ялх")
+      , (47, "шовэткъе ворхI")
+      , (48, "шовэткъе бапхI")
+      , (49, "шовэткъе ийц")
+      , (50, "шовэткъа итт")
+      , (51, "шовэткъе цхьайтта")
+      , (52, "шовэткъе шийтта")
+      , (53, "шовэткъе кхойтта")
+      , (54, "шовэткъе дийтта")
+      , (55, "шовэткъе пхийтта")
+      , (56, "шовэткъе ялхайтта")
+      , (57, "шовэткъе вупийтта")
+      , (58, "шовэткъе бапайтта")
+      , (59, "шовэткъе ткъеста")
+      , (60, "кхоэткъа")
+      , (61, "кхоэткъе цаI")
+      , (62, "кхоэткъе шиъ")
+      , (63, "кхоэткъе кхоъ")
+      , (64, "кхоэткъе диъ")
+      , (65, "кхоэткъе пхиъ")
+      , (66, "кхоэткъе ялх")
+      , (67, "кхоэткъе ворхI")
+      , (68, "кхоэткъе бапхI")
+      , (69, "кхоэткъе ийц")
+      , (70, "кхоэткъа итт")
+      , (71, "кхоэткъе цхьайтта")
+      , (72, "кхоэткъе шийтта")
+      , (73, "кхоэткъе кхойтта")
+      , (74, "кхоэткъе дийтта")
+      , (75, "кхоэткъе пхийтта")
+      , (76, "кхоэткъе ялхайтта")
+      , (77, "кхоэткъе вупийтта")
+      , (78, "кхоэткъе бапайтта")
+      , (79, "кхоэткъе ткъеста")
+      , (80, "деэткъа")
+      , (81, "деэткъе цаI")
+      , (82, "деэткъе шиъ")
+      , (83, "деэткъе кхоъ")
+      , (84, "деэткъе диъ")
+      , (85, "деэткъе пхиъ")
+      , (86, "деэткъе ялх")
+      , (87, "деэткъе ворхI")
+      , (88, "деэткъе бапхI")
+      , (89, "деэткъе ийц")
+      , (90, "деэткъа итт")
+      , (91, "деэткъе цхьайтта")
+      , (92, "деэткъе шийтта")
+      , (93, "деэткъе кхойтта")
+      , (94, "деэткъе дийтта")
+      , (95, "деэткъе пхийтта")
+      , (96, "деэткъе ялхайтта")
+      , (97, "деэткъе вупийтта")
+      , (98, "деэткъе бапайтта")
+      , (99, "деэткъе ткъеста")
+      , (100, "бIаь")
+      , (101, "цхьа бIаьи цаI")
+      , (102, "цхьа бIаьи шиъ")
+      , (103, "цхьа бIаьи кхоъ")
+      , (104, "цхьа бIаьи диъ")
+      , (105, "цхьа бIаьи пхиъ")
+      , (106, "цхьа бIаьи ялх")
+      , (107, "цхьа бIаьи ворхI")
+      , (108, "цхьа бIаьи бапхI")
+      , (109, "цхьа бIаьи ийц")
+      , (110, "цхьа бIаьи итт")
+      , (123, "цхьа бIаьи ткъаь кхоъ")
+      , (200, "ши бIаь")
+      , (300, "кхо бIаь")
+      , (321, "кхо бIаьи ткъаь цаI")
+      , (400, "ди бIаь")
+      , (500, "пхи бIаь")
+      , (600, "ялх бIаь")
+      , (700, "ворх бIаь")
+      , (800, "бапх бIаь")
+      , (900, "ийц бIаь")
+      , (909, "ийц бIаьи ийц")
+      , (990, "ийц бIаьи деэткъа итт")
+      , (999, "ийц бIаьи деэткъе ткъеста")
+      , (1000, "эзап")
+      , (1001, "эзап цаI")
+      , (1008, "эзап бапхI")
+      , (1234, "эзап ши бIаьи ткъаь дийтта")
+      , (2000, "ши эзап")
+      , (3000, "кхо эзап")
+      , (4000, "ди эзап")
+      , (4321, "ди эзап кхо бIаьи ткъаь цаI")
+      , (5000, "пхи эзап")
+      , (6000, "ялх эзап")
+      , (7000, "ворх эзап")
+      , (8000, "бапх эзап")
+      , (9000, "ийц эзап")
+      , (10000, "итт эзап")
+      , (12345, "шийтта эзап кхо бIаьи шовэткъе пхиъ")
+      , (20000, "ткъо эзап")
+      , (30000, "ткъаь итт эзап")
+      , (40000, "шовэткъа эзап")
+      , (50000, "шовэткъа итт эзап")
+      , (54321, "шовэткъе дийтта эзап кхо бIаьи ткъаь цаI")
+      , (60000, "кхоэткъа эзап")
+      , (70000, "кхоэткъа итт эзап")
+      , (80000, "деэткъа эзап")
+      , (90000, "деэткъа итт эзап")
+      , (100000, "цхьа бIаьи эзап")
+      , (123456, "цхьа бIаьи ткъаь кхо эзап ди бIаьи шовэткъе ялхайтта")
+      , (200000, "ши бIаьи эзап")
+      , (300000, "кхо бIаьи эзап")
+      , (400000, "ди бIаьи эзап")
+      , (500000, "пхи бIаьи эзап")
+      , (600000, "ялх бIаьи эзап")
+      , (654321, "ялх бIаьи шовэткъе дийтта эзап кхо бIаьи ткъаь цаI")
+      , (700000, "ворх бIаьи эзап")
+      , (800000, "бапх бIаьи эзап")
+      , (900000, "ийц бIаьи эзап")
+      , (1000000, "миллион")
+      , (1000001, "миллион цаI")
+      , (1234567, "миллион ши бIаьи ткъаь дийтта эзап пхи бIаьи кхоэткъе ворхI")
+      , (2000000, "ши миллион")
+      , (3000000, "кхо миллион")
+      , (4000000, "ди миллион")
+      , (5000000, "пхи миллион")
+      , (6000000, "ялх миллион")
+      , (7000000, "ворх миллион")
+      , (7654321, "ворх миллион ялх бIаьи шовэткъе дийтта эзап кхо бIаьи ткъаь цаI")
+      , (8000000, "бапх миллион")
+      , (9000000, "ийц миллион")
+      , (1000000000, "миллиард")
+      , (1000000001, "миллиард цаI")
+      , (2000000000, "ши миллиард")
+      , (3000000000, "кхо миллиард")
+      , (4000000000, "ди миллиард")
+      , (5000000000, "пхи миллиард")
+      , (6000000000, "ялх миллиард")
+      , (7000000000, "ворх миллиард")
+      , (8000000000, "бапх миллиард")
+      , (9000000000, "ийц миллиард")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/IT/TestData.hs b/src-test/Text/Numeral/Language/IT/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/IT/TestData.hs
+++ /dev/null
@@ -1,295 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        it
-
-[@ISO639-2B@]       ita
-
-[@ISO639-3@]        ita
-
-[@Native name@]     Italiano
-
-[@English name@]    Italian
--}
-
-module Text.Numeral.Language.IT.TestData (cardinals, ordinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
--- Sources:
---   http://www.sf.airnet.ne.jp/~ts/language/number/italian.html
---   http://www.orbilat.com/Languages/Italian/Grammar/Italian-Numerals.html
---   http://italian.about.com/library/weekly/aa042600a.htm
---   http://www.suite101.com/content/how-to-count-in-italian-a146487
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "neuter"
-    , neuter defaultInflection
-    , [ (0, "zero")
-      , (1, "uno")
-      , (2, "due")
-      , (3, "tre")
-      , (4, "quattro")
-      , (5, "cinque")
-      , (6, "sei")
-      , (7, "sette")
-      , (8, "otto")
-      , (9, "nove")
-      , (10, "dieci")
-      , (11, "undici")
-      , (12, "dodici")
-      , (13, "tredici")
-      , (14, "quattordici")
-      , (15, "quindici")
-      , (16, "sedici")
-      , (17, "diciassette")
-      , (18, "diciotto")
-      , (19, "diciannove")
-      , (20, "venti")
-      , (21, "ventuno")
-      , (22, "ventidue")
-      , (23, "ventitré")
-      , (24, "ventiquattro")
-      , (25, "venticinque")
-      , (26, "ventisei")
-      , (27, "ventisette")
-      , (28, "ventotto")
-      , (29, "ventinove")
-      , (30, "trenta")
-      , (31, "trentuno")
-      , (32, "trentadue")
-      , (33, "trentatré")
-      , (34, "trentaquattro")
-      , (35, "trentacinque")
-      , (36, "trentasei")
-      , (37, "trentasette")
-      , (38, "trentotto")
-      , (39, "trentanove")
-      , (40, "quaranta")
-      , (41, "quarantuno")
-      , (42, "quarantadue")
-      , (43, "quarantatré")
-      , (44, "quarantaquattro")
-      , (45, "quarantacinque")
-      , (46, "quarantasei")
-      , (47, "quarantasette")
-      , (48, "quarantotto")
-      , (49, "quarantanove")
-      , (50, "cinquanta")
-      , (51, "cinquantuno")
-      , (52, "cinquantadue")
-      , (53, "cinquantatré")
-      , (54, "cinquantaquattro")
-      , (55, "cinquantacinque")
-      , (56, "cinquantasei")
-      , (57, "cinquantasette")
-      , (58, "cinquantotto")
-      , (59, "cinquantanove")
-      , (60, "sessanta")
-      , (61, "sessantuno")
-      , (62, "sessantadue")
-      , (63, "sessantatré")
-      , (64, "sessantaquattro")
-      , (65, "sessantacinque")
-      , (66, "sessantasei")
-      , (67, "sessantasette")
-      , (68, "sessantotto")
-      , (69, "sessantanove")
-      , (70, "settanta")
-      , (71, "settantuno")
-      , (72, "settantadue")
-      , (73, "settantatré")
-      , (74, "settantaquattro")
-      , (75, "settantacinque")
-      , (76, "settantasei")
-      , (77, "settantasette")
-      , (78, "settantotto")
-      , (79, "settantanove")
-      , (80, "ottanta")
-      , (81, "ottantuno")
-      , (82, "ottantadue")
-      , (83, "ottantatré")
-      , (84, "ottantaquattro")
-      , (85, "ottantacinque")
-      , (86, "ottantasei")
-      , (87, "ottantasette")
-      , (88, "ottantotto")
-      , (89, "ottantanove")
-      , (90, "novanta")
-      , (91, "novantuno")
-      , (92, "novantadue")
-      , (93, "novantatré")
-      , (94, "novantaquattro")
-      , (95, "novantacinque")
-      , (96, "novantasei")
-      , (97, "novantasette")
-      , (98, "novantotto")
-      , (99, "novantanove")
-      , (100, "cento")
-      , (108, "centotto")
-      , (101, "centouno")
-      , (150, "centocinquanta")
-      , (180, "centottanta")
-      , (188, "centottantotto")
-      , (200, "duecento")
-      , (208, "duecentotto")
-      , (280, "duecentottanta")
-      , (288, "duecentottantotto")
-      , (300, "trecento")
-      , (400, "quattrocento")
-      , (456, "quattrocentocinquantasei")
-      , (500, "cinquecento")
-      , (600, "seicento")
-      , (700, "settecento")
-      , (800, "ottocento")
-      , (900, "novecento")
-      , (1000, "mille")
-      , (1001, "milleuno")
-      , (1002, "milledue")
-      , (1100, "millecento")
-      , (1200, "milleduecento")
-      , (2000, "duemila")
-      , (3000, "tremila")
-      , (6827, "seimilaottocentoventisette")
-      , (10000, "diecimila")
-      , (11000, "undicimila")
-      , (100000, "centomila")
-      , (1 ⋅ dec 6, "milione")
-      , (2 ⋅ dec 6, "due milioni")
-      , (125 ⋅ dec 5, "dodici milioni cinquecentomila")
-      , (43152 ⋅ dec 3, "quarantatré milioni centocinquantaduemila")
-      , (132 ⋅ dec 6, "centotrentadue milioni")
-      , (28375 ⋅ dec 4, "duecentottantatré milioni settecentocinquantamila")
-      , (680 ⋅ dec 6, "seicentottanta milioni")
-      , (1 ⋅ dec 9, "miliardo")
-      , (2 ⋅ dec 9, "due miliardi")
-      , (dec 12, "bilione")
-      , (dec 15, "biliardo")
-      , (dec 18, "trilione")
-      , (dec 21, "triliardo")
-      , (dec 24, "quadrilione")
-      , (dec 27, "quadriliardo")
-      , (dec 30, "quintilione")
-      , (dec 33, "quintiliardo")
-      , (dec 36, "sestilione")
-      , (dec 39, "sestiliardo")
-      , (dec 42, "settilione")
-      , (dec 45, "settiliardo")
-      , (dec 48, "ottilione")
-      , (dec 51, "ottiliardo")
-      , (dec 54, "nonilione")
-      , (dec 57, "noniliardo")
-      , (dec 60, "decilione")
-      , (dec 63, "deciliardo")
-      ]
-    )
-  , ( "masculine"
-    , masculine defaultInflection
-    , [ (1, "un")
-      ]
-    )
-  , ( "feminine"
-    , feminine defaultInflection
-    , [ (1, "una")
-      ]
-    )
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "primo")
-      , (2, "secondo")
-      , (3, "terzo")
-      , (4, "quarto")
-      , (5, "quinto")
-      , (6, "sesto")
-      , (7, "settimo")
-      , (8, "ottavo")
-      , (9, "nono")
-      , (10, "decimo")
-      , (11, "undicesimo")
-      , (12, "dodicesimo")
-      , (13, "tredicesimo")
-      , (14, "quattordicesimo")
-      , (15, "quindicesimo")
-      , (16, "sedicesimo")
-      , (17, "diciassettesimo")
-      , (18, "diciottesimo")
-      , (19, "diciannovesimo")
-      , (20, "ventesimo")
-      , (21, "ventunesimo")
-      , (22, "ventiduesimo")
-      , (23, "ventitreesimo")
-      , (24, "ventiquattresimo")
-      , (25, "venticinquesimo")
-      , (26, "ventiseiesimo")
-      , (27, "ventisettesimo")
-      , (28, "ventottesimo")
-      , (29, "ventinovesimo")
-      , (30, "trentesimo")
-      , (31, "trentunesimo")
-      , (32, "trentaduesimo")
-      , (33, "trentatreesimo")
-      , (34, "trentaquattresimo")
-      , (35, "trentacinquesimo")
-      , (36, "trentaseiesimo")
-      , (37, "trentasettesimo")
-      , (38, "trentottesimo")
-      , (39, "trentanovesimo")
-      , (40, "quarantesimo")
-      , (43, "quarantatreesimo")
-      , (50, "cinquantesimo")
-      , (60, "sessantesimo")
-      , (70, "settantesimo")
-      , (80, "ottantesimo")
-      , (89, "ottantanovesimo")
-      , (90, "novantesimo")
-      , (100, "centesimo")
-      , (200, "duecentesimo")
-      , (278, "duecentosettantottesimo")
-      , (300, "trecentesimo")
-      , (400, "quattrocentesimo")
-      , (500, "cinquecentesimo")
-      , (600, "seicentesimo")
-      , (700, "settecentesimo")
-      , (800, "ottocentesimo")
-      , (900, "novecentesimo")
-      , (1000, "millesimo")
-      , (2000, "duemillesimo")
-      , (dec 6, "milionesimo")
-      , (dec 12, "bilionesimo")
-      ]
-    )
-  , ( "feminine"
-    , feminine defaultInflection
-    , [ (1, "prima")
-      , (2, "seconda")
-      , (3, "terza")
-      , (4, "quarta")
-      , (5, "quinta")
-      , (6, "sesta")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/ITA/TestData.hs b/src-test/Text/Numeral/Language/ITA/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/ITA/TestData.hs
@@ -0,0 +1,287 @@
+{-|
+[@ISO639-1@]        it
+
+[@ISO639-2B@]       ita
+
+[@ISO639-3@]        ita
+
+[@Native name@]     Italiano
+
+[@English name@]    Italian
+-}
+
+module Text.Numeral.Language.ITA.TestData (cardinals, ordinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+-- Sources:
+--   http://www.sf.airnet.ne.jp/~ts/language/number/italian.html
+--   http://www.orbilat.com/Languages/Italian/Grammar/Italian-Numerals.html
+--   http://italian.about.com/library/weekly/aa042600a.htm
+--   http://www.suite101.com/content/how-to-count-in-italian-a146487
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "neuter"
+    , neuter defaultInflection
+    , [ (0, "zero")
+      , (1, "uno")
+      , (2, "due")
+      , (3, "tre")
+      , (4, "quattro")
+      , (5, "cinque")
+      , (6, "sei")
+      , (7, "sette")
+      , (8, "otto")
+      , (9, "nove")
+      , (10, "dieci")
+      , (11, "undici")
+      , (12, "dodici")
+      , (13, "tredici")
+      , (14, "quattordici")
+      , (15, "quindici")
+      , (16, "sedici")
+      , (17, "diciassette")
+      , (18, "diciotto")
+      , (19, "diciannove")
+      , (20, "venti")
+      , (21, "ventuno")
+      , (22, "ventidue")
+      , (23, "ventitré")
+      , (24, "ventiquattro")
+      , (25, "venticinque")
+      , (26, "ventisei")
+      , (27, "ventisette")
+      , (28, "ventotto")
+      , (29, "ventinove")
+      , (30, "trenta")
+      , (31, "trentuno")
+      , (32, "trentadue")
+      , (33, "trentatré")
+      , (34, "trentaquattro")
+      , (35, "trentacinque")
+      , (36, "trentasei")
+      , (37, "trentasette")
+      , (38, "trentotto")
+      , (39, "trentanove")
+      , (40, "quaranta")
+      , (41, "quarantuno")
+      , (42, "quarantadue")
+      , (43, "quarantatré")
+      , (44, "quarantaquattro")
+      , (45, "quarantacinque")
+      , (46, "quarantasei")
+      , (47, "quarantasette")
+      , (48, "quarantotto")
+      , (49, "quarantanove")
+      , (50, "cinquanta")
+      , (51, "cinquantuno")
+      , (52, "cinquantadue")
+      , (53, "cinquantatré")
+      , (54, "cinquantaquattro")
+      , (55, "cinquantacinque")
+      , (56, "cinquantasei")
+      , (57, "cinquantasette")
+      , (58, "cinquantotto")
+      , (59, "cinquantanove")
+      , (60, "sessanta")
+      , (61, "sessantuno")
+      , (62, "sessantadue")
+      , (63, "sessantatré")
+      , (64, "sessantaquattro")
+      , (65, "sessantacinque")
+      , (66, "sessantasei")
+      , (67, "sessantasette")
+      , (68, "sessantotto")
+      , (69, "sessantanove")
+      , (70, "settanta")
+      , (71, "settantuno")
+      , (72, "settantadue")
+      , (73, "settantatré")
+      , (74, "settantaquattro")
+      , (75, "settantacinque")
+      , (76, "settantasei")
+      , (77, "settantasette")
+      , (78, "settantotto")
+      , (79, "settantanove")
+      , (80, "ottanta")
+      , (81, "ottantuno")
+      , (82, "ottantadue")
+      , (83, "ottantatré")
+      , (84, "ottantaquattro")
+      , (85, "ottantacinque")
+      , (86, "ottantasei")
+      , (87, "ottantasette")
+      , (88, "ottantotto")
+      , (89, "ottantanove")
+      , (90, "novanta")
+      , (91, "novantuno")
+      , (92, "novantadue")
+      , (93, "novantatré")
+      , (94, "novantaquattro")
+      , (95, "novantacinque")
+      , (96, "novantasei")
+      , (97, "novantasette")
+      , (98, "novantotto")
+      , (99, "novantanove")
+      , (100, "cento")
+      , (108, "centotto")
+      , (101, "centouno")
+      , (150, "centocinquanta")
+      , (180, "centottanta")
+      , (188, "centottantotto")
+      , (200, "duecento")
+      , (208, "duecentotto")
+      , (280, "duecentottanta")
+      , (288, "duecentottantotto")
+      , (300, "trecento")
+      , (400, "quattrocento")
+      , (456, "quattrocentocinquantasei")
+      , (500, "cinquecento")
+      , (600, "seicento")
+      , (700, "settecento")
+      , (800, "ottocento")
+      , (900, "novecento")
+      , (1000, "mille")
+      , (1001, "milleuno")
+      , (1002, "milledue")
+      , (1100, "millecento")
+      , (1200, "milleduecento")
+      , (2000, "duemila")
+      , (3000, "tremila")
+      , (6827, "seimilaottocentoventisette")
+      , (10000, "diecimila")
+      , (11000, "undicimila")
+      , (100000, "centomila")
+      , (1 * dec 6, "milione")
+      , (2 * dec 6, "due milioni")
+      , (125 * dec 5, "dodici milioni cinquecentomila")
+      , (43152 * dec 3, "quarantatré milioni centocinquantaduemila")
+      , (132 * dec 6, "centotrentadue milioni")
+      , (28375 * dec 4, "duecentottantatré milioni settecentocinquantamila")
+      , (680 * dec 6, "seicentottanta milioni")
+      , (1 * dec 9, "miliardo")
+      , (2 * dec 9, "due miliardi")
+      , (dec 12, "bilione")
+      , (dec 15, "biliardo")
+      , (dec 18, "trilione")
+      , (dec 21, "triliardo")
+      , (dec 24, "quadrilione")
+      , (dec 27, "quadriliardo")
+      , (dec 30, "quintilione")
+      , (dec 33, "quintiliardo")
+      , (dec 36, "sestilione")
+      , (dec 39, "sestiliardo")
+      , (dec 42, "settilione")
+      , (dec 45, "settiliardo")
+      , (dec 48, "ottilione")
+      , (dec 51, "ottiliardo")
+      , (dec 54, "nonilione")
+      , (dec 57, "noniliardo")
+      , (dec 60, "decilione")
+      , (dec 63, "deciliardo")
+      ]
+    )
+  , ( "masculine"
+    , masculine defaultInflection
+    , [ (1, "un")
+      ]
+    )
+  , ( "feminine"
+    , feminine defaultInflection
+    , [ (1, "una")
+      ]
+    )
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "primo")
+      , (2, "secondo")
+      , (3, "terzo")
+      , (4, "quarto")
+      , (5, "quinto")
+      , (6, "sesto")
+      , (7, "settimo")
+      , (8, "ottavo")
+      , (9, "nono")
+      , (10, "decimo")
+      , (11, "undicesimo")
+      , (12, "dodicesimo")
+      , (13, "tredicesimo")
+      , (14, "quattordicesimo")
+      , (15, "quindicesimo")
+      , (16, "sedicesimo")
+      , (17, "diciassettesimo")
+      , (18, "diciottesimo")
+      , (19, "diciannovesimo")
+      , (20, "ventesimo")
+      , (21, "ventunesimo")
+      , (22, "ventiduesimo")
+      , (23, "ventitreesimo")
+      , (24, "ventiquattresimo")
+      , (25, "venticinquesimo")
+      , (26, "ventiseiesimo")
+      , (27, "ventisettesimo")
+      , (28, "ventottesimo")
+      , (29, "ventinovesimo")
+      , (30, "trentesimo")
+      , (31, "trentunesimo")
+      , (32, "trentaduesimo")
+      , (33, "trentatreesimo")
+      , (34, "trentaquattresimo")
+      , (35, "trentacinquesimo")
+      , (36, "trentaseiesimo")
+      , (37, "trentasettesimo")
+      , (38, "trentottesimo")
+      , (39, "trentanovesimo")
+      , (40, "quarantesimo")
+      , (43, "quarantatreesimo")
+      , (50, "cinquantesimo")
+      , (60, "sessantesimo")
+      , (70, "settantesimo")
+      , (80, "ottantesimo")
+      , (89, "ottantanovesimo")
+      , (90, "novantesimo")
+      , (100, "centesimo")
+      , (200, "duecentesimo")
+      , (278, "duecentosettantottesimo")
+      , (300, "trecentesimo")
+      , (400, "quattrocentesimo")
+      , (500, "cinquecentesimo")
+      , (600, "seicentesimo")
+      , (700, "settecentesimo")
+      , (800, "ottocentesimo")
+      , (900, "novecentesimo")
+      , (1000, "millesimo")
+      , (2000, "duemillesimo")
+      , (dec 6, "milionesimo")
+      , (dec 12, "bilionesimo")
+      ]
+    )
+  , ( "feminine"
+    , feminine defaultInflection
+    , [ (1, "prima")
+      , (2, "seconda")
+      , (3, "terza")
+      , (4, "quarta")
+      , (5, "quinta")
+      , (6, "sesta")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/IZH/TestData.hs b/src-test/Text/Numeral/Language/IZH/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/IZH/TestData.hs
@@ -0,0 +1,139 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        izh
+
+[@Native name@]     ižoran keel
+
+[@English name@]    Ingrian
+-}
+module Text.Numeral.Language.IZH.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-ingrian/en/izh/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "null")
+      , (1, "üks")
+      , (2, "kaks")
+      , (3, "kold")
+      , (4, "neljä")
+      , (5, "viis")
+      , (6, "kuus")
+      , (7, "seitsemän")
+      , (8, "kaheksan")
+      , (9, "üheksän")
+      , (10, "kümmenän")
+      , (11, "yksitoista")
+      , (12, "kakstoist")
+      , (13, "koldtoist")
+      , (14, "neljätoist")
+      , (15, "viistoist")
+      , (16, "kuustoist")
+      , (17, "seitsemäntoist")
+      , (18, "kaheksantoist")
+      , (19, "üheksäntoist")
+      , (20, "kakskümmend")
+      , (21, "kakskümmend üks")
+      , (22, "kakskümmend kaks")
+      , (23, "kakskümmend kold")
+      , (24, "kakskümmend neljä")
+      , (25, "kakskümmend viis")
+      , (26, "kakskümmend kuus")
+      , (27, "kakskümmend seitsemän")
+      , (28, "kakskümmend kaheksan")
+      , (29, "kakskümmend üheksän")
+      , (30, "koldkümmend")
+      , (31, "koldkümmend üks")
+      , (32, "koldkümmend kaks")
+      , (33, "koldkümmend kold")
+      , (34, "koldkümmend neljä")
+      , (35, "koldkümmend viis")
+      , (36, "koldkümmend kuus")
+      , (37, "koldkümmend seitsemän")
+      , (38, "koldkümmend kaheksan")
+      , (39, "koldkümmend üheksän")
+      , (40, "neljäkümmend")
+      , (41, "neljäkümmend üks")
+      , (42, "neljäkümmend kaks")
+      , (43, "neljäkümmend kold")
+      , (44, "neljäkümmend neljä")
+      , (45, "neljäkümmend viis")
+      , (46, "neljäkümmend kuus")
+      , (47, "neljäkümmend seitsemän")
+      , (48, "neljäkümmend kaheksan")
+      , (49, "neljäkümmend üheksän")
+      , (50, "viiskümmend")
+      , (51, "viiskümmend üks")
+      , (52, "viiskümmend kaks")
+      , (53, "viiskümmend kold")
+      , (54, "viiskümmend neljä")
+      , (55, "viiskümmend viis")
+      , (56, "viiskümmend kuus")
+      , (57, "viiskümmend seitsemän")
+      , (58, "viiskümmend kaheksan")
+      , (59, "viiskümmend üheksän")
+      , (60, "kuuskümmend")
+      , (61, "kuuskümmend üks")
+      , (62, "kuuskümmend kaks")
+      , (63, "kuuskümmend kold")
+      , (64, "kuuskümmend neljä")
+      , (65, "kuuskümmend viis")
+      , (66, "kuuskümmend kuus")
+      , (67, "kuuskümmend seitsemän")
+      , (68, "kuuskümmend kaheksan")
+      , (69, "kuuskümmend üheksän")
+      , (70, "seitsemänkümmend")
+      , (71, "seitsemänkümmend üks")
+      , (72, "seitsemänkümmend kaks")
+      , (73, "seitsemänkümmend kold")
+      , (74, "seitsemänkümmend neljä")
+      , (75, "seitsemänkümmend viis")
+      , (76, "seitsemänkümmend kuus")
+      , (77, "seitsemänkümmend seitsemän")
+      , (78, "seitsemänkümmend kaheksan")
+      , (79, "seitsemänkümmend üheksän")
+      , (80, "kaheksankümmend")
+      , (81, "kaheksankümmend üks")
+      , (82, "kaheksankümmend kaks")
+      , (83, "kaheksankümmend kold")
+      , (84, "kaheksankümmend neljä")
+      , (85, "kaheksankümmend viis")
+      , (86, "kaheksankümmend kuus")
+      , (87, "kaheksankümmend seitsemän")
+      , (88, "kaheksankümmend kaheksan")
+      , (89, "kaheksankümmend üheksän")
+      , (90, "üheksänkümmend")
+      , (91, "üheksänkümmend üks")
+      , (92, "üheksänkümmend kaks")
+      , (93, "üheksänkümmend kold")
+      , (94, "üheksänkümmend neljä")
+      , (95, "üheksänkümmend viis")
+      , (96, "üheksänkümmend kuus")
+      , (97, "üheksänkümmend seitsemän")
+      , (98, "üheksänkümmend kaheksan")
+      , (99, "üheksänkümmend üheksän")
+      , (100, "sada")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/JA/TestData.hs b/src-test/Text/Numeral/Language/JA/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/JA/TestData.hs
+++ /dev/null
@@ -1,217 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        ja
-
-[@ISO639-2B@]       jpn
-
-[@ISO639-3@]        jpn
-
-[@Native name@]     日本語
-
-[@English name@]    Japanese
--}
-
-module Text.Numeral.Language.JA.TestData
-    ( preferred_cardinals
-    , kanji_cardinals
-    , daiji_cardinals
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Num, Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- JA
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://en.wikipedia.org/wiki/Japanese_numerals
-  http://www.guidetojapanese.org/numbers.html
--}
-
-preferred_cardinals ∷ (Num i) ⇒ TestData i
-preferred_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "rei")
-      , (1, "ichi")
-      , (2, "ni")
-      , (3, "san")
-      , (4, "yon")
-      , (5, "go")
-      , (6, "roku")
-      , (7, "nana")
-      , (8, "hachi")
-      , (9, "kyū")
-      , (10, "jū")
-      , (11, "jū ichi")
-      , (12, "jū ni")
-      , (13, "jū san")
-      , (14, "jū yon")
-      , (15, "jū go")
-      , (16, "jū roku")
-      , (17, "jū nana")
-      , (18, "jū hachi")
-      , (19, "jū kyū")
-      , (20, "nijū")
-      , (21, "nijū ichi")
-      , (22, "nijū ni")
-      , (23, "nijū san")
-      , (24, "nijū yon")
-      , (25, "nijū go")
-      , (26, "nijū roku")
-      , (27, "nijū nana")
-      , (28, "nijū hachi")
-      , (29, "nijū kyū")
-      , (30, "sanjū")
-      , (31, "sanjū ichi")
-      , (32, "sanjū ni")
-      , (33, "sanjū san")
-      , (34, "sanjū yon")
-      , (35, "sanjū go")
-      , (36, "sanjū roku")
-      , (37, "sanjū nana")
-      , (38, "sanjū hachi")
-      , (39, "sanjū kyū")
-      , (40, "yonjū")
-      , (41, "yonjū ichi")
-      , (42, "yonjū ni")
-      , (43, "yonjū san")
-      , (44, "yonjū yon")
-      , (45, "yonjū go")
-      , (46, "yonjū roku")
-      , (47, "yonjū nana")
-      , (48, "yonjū hachi")
-      , (49, "yonjū kyū")
-      , (50, "gojū")
-      , (51, "gojū ichi")
-      , (52, "gojū ni")
-      , (53, "gojū san")
-      , (54, "gojū yon")
-      , (55, "gojū go")
-      , (56, "gojū roku")
-      , (57, "gojū nana")
-      , (58, "gojū hachi")
-      , (59, "gojū kyū")
-      , (60, "rokujū")
-      , (61, "rokujū ichi")
-      , (62, "rokujū ni")
-      , (63, "rokujū san")
-      , (64, "rokujū yon")
-      , (65, "rokujū go")
-      , (66, "rokujū roku")
-      , (67, "rokujū nana")
-      , (68, "rokujū hachi")
-      , (69, "rokujū kyū")
-      , (70, "nanajū")
-      , (71, "nanajū ichi")
-      , (72, "nanajū ni")
-      , (73, "nanajū san")
-      , (74, "nanajū yon")
-      , (75, "nanajū go")
-      , (76, "nanajū roku")
-      , (77, "nanajū nana")
-      , (78, "nanajū hachi")
-      , (79, "nanajū kyū")
-      , (80, "hachijū")
-      , (81, "hachijū ichi")
-      , (82, "hachijū ni")
-      , (83, "hachijū san")
-      , (84, "hachijū yon")
-      , (85, "hachijū go")
-      , (86, "hachijū roku")
-      , (87, "hachijū nana")
-      , (88, "hachijū hachi")
-      , (89, "hachijū kyū")
-      , (90, "kyūjū")
-      , (91, "kyūjū ichi")
-      , (92, "kyūjū ni")
-      , (93, "kyūjū san")
-      , (94, "kyūjū yon")
-      , (95, "kyūjū go")
-      , (96, "kyūjū roku")
-      , (97, "kyūjū nana")
-      , (98, "kyūjū hachi")
-      , (99, "kyūjū kyū")
-      , (100, "hyaku")
-      , (208, "nihyaku hachi")
-      , (280, "nihyaku hachijū")
-      , (2008, "nisen hachi")
-      , (2080, "nisen hachijū")
-      , (2800, "nisen hachihyaku")
-      ]
-    )
-  ]
-
-kanji_cardinals ∷ (Integral i) ⇒ TestData i
-kanji_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "零")
-      , (1, "一")
-      , (2, "二")
-      , (3, "三")
-      , (4, "四")
-      , (5, "五")
-      , (6, "六")
-      , (7, "七")
-      , (8, "八")
-      , (9, "九")
-      , (10, "十")
-      , (11, "十一")
-      , (12, "十二")
-      , (13, "十三")
-      , (14, "十四")
-      , (21, "二十一")
-      , (28, "二十八")
-      , (100, "百")
-      , (208, "二百八")
-      , (280, "二百八十")
-      , (321, "三百二十一")
-      , (1000, "千")
-      , (2008, "二千八")
-      , (2080, "二千八十")
-      , (2800, "二千八百")
-      , (4321, "四千三百二十一")
-      , (10000, "一万")
-      , (654321, "六十五万四千三百二十一")
-      , (87654321, "八千七百六十五万四千三百二十一")
-      , (100000000, "一億")
-      , (987654321, "九億八千七百六十五万四千三百二十一")
-      , (dec 12, "一兆")
-      ]
-    )
-  ]
-
-daiji_cardinals ∷ (Integral i) ⇒ TestData i
-daiji_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "零")
-      , (1, "壱")
-      , (2, "弐")
-      , (3, "参")
-      , (4, "四")
-      , (5, "五")
-      , (6, "六")
-      , (7, "七")
-      , (8, "八")
-      , (9, "九")
-      , (10, "拾")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/JPN/TestData.hs b/src-test/Text/Numeral/Language/JPN/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/JPN/TestData.hs
@@ -0,0 +1,211 @@
+{-|
+[@ISO639-1@]        ja
+
+[@ISO639-2B@]       jpn
+
+[@ISO639-3@]        jpn
+
+[@Native name@]     日本語
+
+[@English name@]    Japanese
+-}
+
+module Text.Numeral.Language.JPN.TestData
+    ( preferred_cardinals
+    , kanji_cardinals
+    , daiji_cardinals
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Prelude     ( Num, Integral )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- JPN
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://en.wikipedia.org/wiki/Japanese_numerals
+  http://www.guidetojapanese.org/numbers.html
+-}
+
+preferred_cardinals :: (Num i) => TestData i
+preferred_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "rei")
+      , (1, "ichi")
+      , (2, "ni")
+      , (3, "san")
+      , (4, "yon")
+      , (5, "go")
+      , (6, "roku")
+      , (7, "nana")
+      , (8, "hachi")
+      , (9, "kyū")
+      , (10, "jū")
+      , (11, "jū ichi")
+      , (12, "jū ni")
+      , (13, "jū san")
+      , (14, "jū yon")
+      , (15, "jū go")
+      , (16, "jū roku")
+      , (17, "jū nana")
+      , (18, "jū hachi")
+      , (19, "jū kyū")
+      , (20, "nijū")
+      , (21, "nijū ichi")
+      , (22, "nijū ni")
+      , (23, "nijū san")
+      , (24, "nijū yon")
+      , (25, "nijū go")
+      , (26, "nijū roku")
+      , (27, "nijū nana")
+      , (28, "nijū hachi")
+      , (29, "nijū kyū")
+      , (30, "sanjū")
+      , (31, "sanjū ichi")
+      , (32, "sanjū ni")
+      , (33, "sanjū san")
+      , (34, "sanjū yon")
+      , (35, "sanjū go")
+      , (36, "sanjū roku")
+      , (37, "sanjū nana")
+      , (38, "sanjū hachi")
+      , (39, "sanjū kyū")
+      , (40, "yonjū")
+      , (41, "yonjū ichi")
+      , (42, "yonjū ni")
+      , (43, "yonjū san")
+      , (44, "yonjū yon")
+      , (45, "yonjū go")
+      , (46, "yonjū roku")
+      , (47, "yonjū nana")
+      , (48, "yonjū hachi")
+      , (49, "yonjū kyū")
+      , (50, "gojū")
+      , (51, "gojū ichi")
+      , (52, "gojū ni")
+      , (53, "gojū san")
+      , (54, "gojū yon")
+      , (55, "gojū go")
+      , (56, "gojū roku")
+      , (57, "gojū nana")
+      , (58, "gojū hachi")
+      , (59, "gojū kyū")
+      , (60, "rokujū")
+      , (61, "rokujū ichi")
+      , (62, "rokujū ni")
+      , (63, "rokujū san")
+      , (64, "rokujū yon")
+      , (65, "rokujū go")
+      , (66, "rokujū roku")
+      , (67, "rokujū nana")
+      , (68, "rokujū hachi")
+      , (69, "rokujū kyū")
+      , (70, "nanajū")
+      , (71, "nanajū ichi")
+      , (72, "nanajū ni")
+      , (73, "nanajū san")
+      , (74, "nanajū yon")
+      , (75, "nanajū go")
+      , (76, "nanajū roku")
+      , (77, "nanajū nana")
+      , (78, "nanajū hachi")
+      , (79, "nanajū kyū")
+      , (80, "hachijū")
+      , (81, "hachijū ichi")
+      , (82, "hachijū ni")
+      , (83, "hachijū san")
+      , (84, "hachijū yon")
+      , (85, "hachijū go")
+      , (86, "hachijū roku")
+      , (87, "hachijū nana")
+      , (88, "hachijū hachi")
+      , (89, "hachijū kyū")
+      , (90, "kyūjū")
+      , (91, "kyūjū ichi")
+      , (92, "kyūjū ni")
+      , (93, "kyūjū san")
+      , (94, "kyūjū yon")
+      , (95, "kyūjū go")
+      , (96, "kyūjū roku")
+      , (97, "kyūjū nana")
+      , (98, "kyūjū hachi")
+      , (99, "kyūjū kyū")
+      , (100, "hyaku")
+      , (208, "nihyaku hachi")
+      , (280, "nihyaku hachijū")
+      , (2008, "nisen hachi")
+      , (2080, "nisen hachijū")
+      , (2800, "nisen hachihyaku")
+      ]
+    )
+  ]
+
+kanji_cardinals :: (Integral i) => TestData i
+kanji_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "零")
+      , (1, "一")
+      , (2, "二")
+      , (3, "三")
+      , (4, "四")
+      , (5, "五")
+      , (6, "六")
+      , (7, "七")
+      , (8, "八")
+      , (9, "九")
+      , (10, "十")
+      , (11, "十一")
+      , (12, "十二")
+      , (13, "十三")
+      , (14, "十四")
+      , (21, "二十一")
+      , (28, "二十八")
+      , (100, "百")
+      , (208, "二百八")
+      , (280, "二百八十")
+      , (321, "三百二十一")
+      , (1000, "千")
+      , (2008, "二千八")
+      , (2080, "二千八十")
+      , (2800, "二千八百")
+      , (4321, "四千三百二十一")
+      , (10000, "一万")
+      , (654321, "六十五万四千三百二十一")
+      , (87654321, "八千七百六十五万四千三百二十一")
+      , (100000000, "一億")
+      , (987654321, "九億八千七百六十五万四千三百二十一")
+      , (dec 12, "一兆")
+      ]
+    )
+  ]
+
+daiji_cardinals :: (Integral i) => TestData i
+daiji_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "零")
+      , (1, "壱")
+      , (2, "弐")
+      , (3, "参")
+      , (4, "四")
+      , (5, "五")
+      , (6, "六")
+      , (7, "七")
+      , (8, "八")
+      , (9, "九")
+      , (10, "拾")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/KAP/TestData.hs b/src-test/Text/Numeral/Language/KAP/TestData.hs
--- a/src-test/Text/Numeral/Language/KAP/TestData.hs
+++ b/src-test/Text/Numeral/Language/KAP/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-bezhta/en/kap/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/KEA/TestData.hs b/src-test/Text/Numeral/Language/KEA/TestData.hs
--- a/src-test/Text/Numeral/Language/KEA/TestData.hs
+++ b/src-test/Text/Numeral/Language/KEA/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-cape-verdean-creole/en/kea/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/KLB/TestData.hs b/src-test/Text/Numeral/Language/KLB/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/KLB/TestData.hs
@@ -0,0 +1,175 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        klb
+
+[@Native name@]     Koléew Ñaja'
+
+[@English name@]    Kiliwa
+-}
+module Text.Numeral.Language.KLB.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-kiliwa/en/lkb/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "msig")
+      , (2, "juwak")
+      , (3, "jmi’k")
+      , (4, "mnak")
+      , (5, "salchipam")
+      , (6, "msigl paayp")
+      , (7, "juwakl paayp")
+      , (8, "jmi’kl paayp")
+      , (9, "msigl tmat")
+      , (10, "chipam msig")
+      , (11, "chipam msig, msig tmaljaa")
+      , (12, "chipam msig, juwak tmaljaa")
+      , (13, "chipam msig, jmi’k tmaljaa")
+      , (14, "chipam msig, mnak tmaljaa")
+      , (15, "chipam msig, salchipam tmaljaa")
+      , (16, "chipam msig, msigl paayp tmaljaa")
+      , (17, "chipam msig, juwakl paayp tmaljaa")
+      , (18, "chipam msig, jmi’kl paayp tmaljaa")
+      , (19, "chipam msig, msigl tmat tmaljaa")
+      , (20, "chipam juwak")
+      , (21, "chipam juwak, msig tmaljaa")
+      , (22, "chipam juwak, juwak tmaljaa")
+      , (23, "chipam juwak, jmi’k tmaljaa")
+      , (24, "chipam juwak, mnak tmaljaa")
+      , (25, "chipam juwak, salchipam tmaljaa")
+      , (26, "chipam juwak, msigl paayp tmaljaa")
+      , (27, "chipam juwak, juwakl paayp tmaljaa")
+      , (28, "chipam juwak, jmi’kl paayp tmaljaa")
+      , (29, "chipam juwak, msigl tmat tmaljaa")
+      , (30, "chipam jmi’k")
+      , (31, "chipam jmi’k, msig tmaljaa")
+      , (32, "chipam jmi’k, juwak tmaljaa")
+      , (33, "chipam jmi’k, jmi’k tmaljaa")
+      , (34, "chipam jmi’k, mnak tmaljaa")
+      , (35, "chipam jmi’k, salchipam tmaljaa")
+      , (36, "chipam jmi’k, msigl paayp tmaljaa")
+      , (37, "chipam jmi’k, juwakl paayp tmaljaa")
+      , (38, "chipam jmi’k, jmi’kl paayp tmaljaa")
+      , (39, "chipam jmi’k, msigl tmat tmaljaa")
+      , (40, "chipam mnak")
+      , (41, "chipam mnak, msig tmaljaa")
+      , (42, "chipam mnak, juwak tmaljaa")
+      , (43, "chipam mnak, jmi’k tmaljaa")
+      , (44, "chipam mnak, mnak tmaljaa")
+      , (45, "chipam mnak, salchipam tmaljaa")
+      , (46, "chipam mnak, msigl paayp tmaljaa")
+      , (47, "chipam mnak, juwakl paayp tmaljaa")
+      , (48, "chipam mnak, jmi’kl paayp tmaljaa")
+      , (49, "chipam mnak, msigl tmat tmaljaa")
+      , (50, "chipam salchipam")
+      , (51, "chipam salchipam, msig tmaljaa")
+      , (52, "chipam salchipam, juwak tmaljaa")
+      , (53, "chipam salchipam, jmi’k tmaljaa")
+      , (54, "chipam salchipam, mnak tmaljaa")
+      , (55, "chipam salchipam, salchipam tmaljaa")
+      , (56, "chipam salchipam, msigl paayp tmaljaa")
+      , (57, "chipam salchipam, juwakl paayp tmaljaa")
+      , (58, "chipam salchipam, jmi’kl paayp tmaljaa")
+      , (59, "chipam salchipam, msigl tmat tmaljaa")
+      , (60, "chipam msigl paayp")
+      , (61, "chipam msigl paayp, msig tmaljaa")
+      , (62, "chipam msigl paayp, juwak tmaljaa")
+      , (63, "chipam msigl paayp, jmi’k tmaljaa")
+      , (64, "chipam msigl paayp, mnak tmaljaa")
+      , (65, "chipam msigl paayp, salchipam tmaljaa")
+      , (66, "chipam msigl paayp, msigl paayp tmaljaa")
+      , (67, "chipam msigl paayp, juwakl paayp tmaljaa")
+      , (68, "chipam msigl paayp, jmi’kl paayp tmaljaa")
+      , (69, "chipam msigl paayp, msigl tmat tmaljaa")
+      , (70, "chipam juwakl paayb")
+      , (71, "chipam juwakl paayb, msig tmaljaa")
+      , (72, "chipam juwakl paayb, juwak tmaljaa")
+      , (73, "chipam juwakl paayb, jmi’k tmaljaa")
+      , (74, "chipam juwakl paayb, mnak tmaljaa")
+      , (75, "chipam juwakl paayb, salchipam tmaljaa")
+      , (76, "chipam juwakl paayb, msigl paayp tmaljaa")
+      , (77, "chipam juwakl paayb, juwakl paayp tmaljaa")
+      , (78, "chipam juwakl paayb, jmi’kl paayp tmaljaa")
+      , (79, "chipam juwakl paayb, msigl tmat tmaljaa")
+      , (80, "chipam jmi’kl paayb")
+      , (81, "chipam jmi’kl paayb, msig tmaljaa")
+      , (82, "chipam jmi’kl paayb, juwak tmaljaa")
+      , (83, "chipam jmi’kl paayb, jmi’k tmaljaa")
+      , (84, "chipam jmi’kl paayb, mnak tmaljaa")
+      , (85, "chipam jmi’kl paayb, salchipam tmaljaa")
+      , (86, "chipam jmi’kl paayb, msigl paayp tmaljaa")
+      , (87, "chipam jmi’kl paayb, juwakl paayp tmaljaa")
+      , (88, "chipam jmi’kl paayb, jmi’kl paayp tmaljaa")
+      , (89, "chipam jmi’kl paayb, msigl tmat tmaljaa")
+      , (90, "chipam msigl tmat")
+      , (91, "chipam msigl tmat, msig tmaljaa")
+      , (92, "chipam msigl tmat, juwak tmaljaa")
+      , (93, "chipam msigl tmat, jmi’k tmaljaa")
+      , (94, "chipam msigl tmat, mnak tmaljaa")
+      , (95, "chipam msigl tmat, salchipam tmaljaa")
+      , (96, "chipam msigl tmat, msigl paayp tmaljaa")
+      , (97, "chipam msigl tmat, juwakl paayp tmaljaa")
+      , (98, "chipam msigl tmat, jmi’kl paayp tmaljaa")
+      , (99, "chipam msigl tmat, msigl tmat tmaljaa")
+      , (100, "chipam msig u’ kun yuu chipam msig")
+      , (101, "chipam msig u’ kun yuu chipam msig, msig tmaljaa")
+      , (102, "chipam msig u’ kun yuu chipam msig, juwak tmaljaa")
+      , (103, "chipam msig u’ kun yuu chipam msig, jmi’k tmaljaa")
+      , (104, "chipam msig u’ kun yuu chipam msig, mnak tmaljaa")
+      , (105, "chipam msig u’ kun yuu chipam msig, salchipam tmaljaa")
+      , (106, "chipam msig u’ kun yuu chipam msig, msigl paayp tmaljaa")
+      , (107, "chipam msig u’ kun yuu chipam msig, juwakl paayp tmaljaa")
+      , (108, "chipam msig u’ kun yuu chipam msig, jmi’kl paayp tmaljaa")
+      , (109, "chipam msig u’ kun yuu chipam msig, msigl tmat tmaljaa")
+      , (110, "chipam msig u’ kun yuu chipam msig, chipam msig")
+      , (123, "chipam msig u’ kun yuu chipam msig, chipam juwak, jmi’k tmaljaa")
+      , (200, "chipam msig u’ kun yuu chipam juwak")
+      , (300, "chipam msig u’ kun yuu chipam jmi’k")
+      , (321, "chipam msig u’ kun yuu chipam jmi’k, chipam juwak, msig tmaljaa")
+      , (400, "chipam msig u’ kun yuu chipam mnak")
+      , (500, "chipam msig u’ kun yuu chipam salchipam")
+      , (600, "chipam msig u’ kun yuu chipam msigl paayp")
+      , (700, "chipam msig u’ kun yuu chipam juwakl paayp")
+      , (800, "chipam msig u’ kun yuu chipam jmi’kl paayp")
+      , (900, "chipam msig u’ kun yuu chipam msigl tmat")
+      , (909, "chipam msig u’ kun yuu chipam msigl tmat, msigl tmat tmaljaa")
+      , (990, "chipam msig u’ kun yuu chipam msigl tmat, chipam msigl tmat")
+      , (999, "chipam msig u’ kun yuu chipam msigl tmat, chipam msigl tmat, msigl tmat tmaljaa")
+      , (1000, "chipam msig u’ kuetet msig")
+      , (1001, "chipam msig u’ kuetet msig, msig tmaljaa")
+      , (1008, "chipam msig u’ kuetet msig, jmi’kl paayp tmaljaa")
+      , (1234, "chipam msig u’ kuetet msig, chipam msig u’ kun yuu chipam juwak, chipam jmi’k, mnak tmaljaa")
+      , (2000, "chipam msig u’ kuetet juwak")
+      , (3000, "chipam msig u’ kuetet jmi’k")
+      , (4000, "chipam msig u’ kuetet mnak")
+      , (4321, "chipam msig u’ kuetet mnak, chipam msig u’ kun yuu chipam jmi’k, chipam juwak, msig tmaljaa")
+      , (5000, "chipam msig u’ kuetet salchipam")
+      , (6000, "chipam msig u’ kuetet msigl paayp")
+      , (7000, "chipam msig u’ kuetet juwakl paayp")
+      , (8000, "chipam msig u’ kuetet jmi’kl paayp")
+      , (9000, "chipam msig u’ kuetet msigl tmat")
+      , (10000, "chipam msig u’ kuetet chipam msig")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/KMR/TestData.hs b/src-test/Text/Numeral/Language/KMR/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/KMR/TestData.hs
@@ -0,0 +1,209 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        kmr
+
+[@Native name@]     -
+
+[@English name@]    Kurmanji
+-}
+module Text.Numeral.Language.KMR.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-northern-kurdish/en/kmr/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "sifir")
+      , (1, "yek")
+      , (2, "du")
+      , (3, "sê")
+      , (4, "çar")
+      , (5, "pênc")
+      , (6, "şeş")
+      , (7, "heft")
+      , (8, "heşt")
+      , (9, "neh")
+      , (10, "deh")
+      , (11, "yanzdeh")
+      , (12, "dwanzdeh")
+      , (13, "sêzdeh")
+      , (14, "çardeh")
+      , (15, "panzdeh")
+      , (16, "şanzdeh")
+      , (17, "hivdeh")
+      , (18, "hijdeh")
+      , (19, "nozdeh")
+      , (20, "bîst")
+      , (21, "bîst û yek")
+      , (22, "bîst û du")
+      , (23, "bîst û sê")
+      , (24, "bîst û çar")
+      , (25, "bîst û pênc")
+      , (26, "bîst û şeş")
+      , (27, "bîst û heft")
+      , (28, "bîst û heşt")
+      , (29, "bîst û neh")
+      , (30, "sî")
+      , (31, "sî û yek")
+      , (32, "sî û du")
+      , (33, "sî û sê")
+      , (34, "sî û çar")
+      , (35, "sî û pênc")
+      , (36, "sî û şeş")
+      , (37, "sî û heft")
+      , (38, "sî û heşt")
+      , (39, "sî û neh")
+      , (40, "çil")
+      , (41, "çil û yek")
+      , (42, "çil û du")
+      , (43, "çil û sê")
+      , (44, "çil û çar")
+      , (45, "çil û pênc")
+      , (46, "çil û şeş")
+      , (47, "çil û heft")
+      , (48, "çil û heşt")
+      , (49, "çil û neh")
+      , (50, "pêncî")
+      , (51, "pêncî û yek")
+      , (52, "pêncî û du")
+      , (53, "pêncî û sê")
+      , (54, "pêncî û çar")
+      , (55, "pêncî û pênc")
+      , (56, "pêncî û şeş")
+      , (57, "pêncî û heft")
+      , (58, "pêncî û heşt")
+      , (59, "pêncî û neh")
+      , (60, "şêst")
+      , (61, "şêst û yek")
+      , (62, "şêst û du")
+      , (63, "şêst û sê")
+      , (64, "şêst û çar")
+      , (65, "şêst û pênc")
+      , (66, "şêst û şeş")
+      , (67, "şêst û heft")
+      , (68, "şêst û heşt")
+      , (69, "şêst û neh")
+      , (70, "heftê")
+      , (71, "heftê û yek")
+      , (72, "heftê û du")
+      , (73, "heftê û sê")
+      , (74, "heftê û çar")
+      , (75, "heftê û pênc")
+      , (76, "heftê û şeş")
+      , (77, "heftê û heft")
+      , (78, "heftê û heşt")
+      , (79, "heftê û neh")
+      , (80, "heştê")
+      , (81, "heştê û yek")
+      , (82, "heştê û du")
+      , (83, "heştê û sê")
+      , (84, "heştê û çar")
+      , (85, "heştê û pênc")
+      , (86, "heştê û şeş")
+      , (87, "heştê û heft")
+      , (88, "heştê û heşt")
+      , (89, "heştê û neh")
+      , (90, "nod")
+      , (91, "nod û yek")
+      , (92, "nod û du")
+      , (93, "nod û sê")
+      , (94, "nod û çar")
+      , (95, "nod û pênc")
+      , (96, "nod û şeş")
+      , (97, "nod û heft")
+      , (98, "nod û heşt")
+      , (99, "nod û neh")
+      , (100, "sed")
+      , (101, "sed û yek")
+      , (102, "sed û du")
+      , (103, "sed û sê")
+      , (104, "sed û çar")
+      , (105, "sed û pênc")
+      , (106, "sed û şeş")
+      , (107, "sed û heft")
+      , (108, "sed û heşt")
+      , (109, "sed û neh")
+      , (110, "sed û deh")
+      , (123, "sed û bîst û sê")
+      , (200, "dused")
+      , (300, "sêsed")
+      , (321, "sêsed û bîst û yek")
+      , (400, "çarsed")
+      , (500, "pêncsed")
+      , (600, "şeşsed")
+      , (700, "heftsed")
+      , (800, "heştsed")
+      , (900, "nehsed")
+      , (909, "nehsed û neh")
+      , (990, "nehsed û nod")
+      , (999, "nehsed û nod û neh")
+      , (1000, "hezar")
+      , (1001, "hezar û yek")
+      , (1008, "hezar û heşt")
+      , (1234, "hezar û dused û sî û çar")
+      , (2000, "du hezar")
+      , (3000, "sê hezar")
+      , (4000, "çar hezar")
+      , (4321, "çar hezar û sêsed û bîst û yek")
+      , (5000, "pênc hezar")
+      , (6000, "şeş hezar")
+      , (7000, "heft hezar")
+      , (8000, "heşt hezar")
+      , (9000, "neh hezar")
+      , (10000, "deh hezar")
+      , (12345, "dwanzdeh hezar û sêsed û çil û pênc")
+      , (20000, "bîst hezar")
+      , (30000, "sî hezar")
+      , (40000, "çil hezar")
+      , (50000, "pêncî hezar")
+      , (54321, "pêncî û çar hezar û sêsed û bîst û yek")
+      , (60000, "şêst hezar")
+      , (70000, "heftê hezar")
+      , (80000, "heştê hezar")
+      , (90000, "nod hezar")
+      , (100000, "sed hezar")
+      , (123456, "sed û bîst û sê hezar û çarsed û pêncî û şeş")
+      , (200000, "dused hezar")
+      , (300000, "sêsed hezar")
+      , (400000, "çarsed hezar")
+      , (500000, "pêncsed hezar")
+      , (600000, "şeşsed hezar")
+      , (654321, "şeşsed û pêncî û çar hezar û sêsed û bîst û yek")
+      , (700000, "heftsed hezar")
+      , (800000, "heştsed hezar")
+      , (900000, "nehsed hezar")
+      , (1000000, "milyon")
+      , (1000001, "milyon û yek")
+      , (1234567, "milyon û dused û sî û çar hezar û pêncsed û şêst û heft")
+      , (2000000, "du milyon")
+      , (3000000, "sê milyon")
+      , (4000000, "çar milyon")
+      , (5000000, "pênc milyon")
+      , (6000000, "şeş milyon")
+      , (7000000, "heft milyon")
+      , (7654321, "heft milyon û şeşsed û pêncî û çar hezar û sêsed û bîst û yek")
+      , (8000000, "heşt milyon")
+      , (9000000, "neh milyon")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/KRL/TestData.hs b/src-test/Text/Numeral/Language/KRL/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/KRL/TestData.hs
@@ -0,0 +1,138 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        krl
+
+[@ISO639-3@]        krl
+
+[@Native name@]     karjala, karjal, kariela
+
+[@English name@]    Karelian
+-}
+module Text.Numeral.Language.KRL.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-karelian/en/krl/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "yksi")
+      , (2, "kakši")
+      , (3, "kolme")
+      , (4, "neljjä")
+      , (5, "viizi")
+      , (6, "kuuǯi")
+      , (7, "seiččemän")
+      , (8, "kahekšan")
+      , (9, "yhekšän")
+      , (10, "kymmenen")
+      , (11, "yksitoista")
+      , (12, "kakšitoista")
+      , (13, "kolmetoista")
+      , (14, "neljjätoista")
+      , (15, "viiztoista")
+      , (16, "kuuǯitoista")
+      , (17, "seiččemäntoista")
+      , (18, "kahekšantoista")
+      , (19, "yhekšäntoista")
+      , (20, "kakšikymmendä")
+      , (21, "kakšikymmendä yksi")
+      , (22, "kakšikymmendä kakši")
+      , (23, "kakšikymmendä kolme")
+      , (24, "kakšikymmendä neljjä")
+      , (25, "kakšikymmendä viizi")
+      , (26, "kakšikymmendä kuuǯi")
+      , (27, "kakšikymmendä seiččemän")
+      , (28, "kakšikymmendä kahekšan")
+      , (29, "kakšikymmendä yhekšän")
+      , (30, "kolmekymmendä")
+      , (31, "kolmekymmendä yksi")
+      , (32, "kolmekymmendä kakši")
+      , (33, "kolmekymmendä kolme")
+      , (34, "kolmekymmendä neljjä")
+      , (35, "kolmekymmendä viizi")
+      , (36, "kolmekymmendä kuuǯi")
+      , (37, "kolmekymmendä seiččemän")
+      , (38, "kolmekymmendä kahekšan")
+      , (39, "kolmekymmendä yhekšän")
+      , (40, "neljjäkymmendä")
+      , (41, "neljjäkymmendä yksi")
+      , (42, "neljjäkymmendä kakši")
+      , (43, "neljjäkymmendä kolme")
+      , (44, "neljjäkymmendä neljjä")
+      , (45, "neljjäkymmendä viizi")
+      , (46, "neljjäkymmendä kuuǯi")
+      , (47, "neljjäkymmendä seiččemän")
+      , (48, "neljjäkymmendä kahekšan")
+      , (49, "neljjäkymmendä yhekšän")
+      , (50, "viizikymmendä")
+      , (51, "viizikymmendä yksi")
+      , (52, "viizikymmendä kakši")
+      , (53, "viizikymmendä kolme")
+      , (54, "viizikymmendä neljjä")
+      , (55, "viizikymmendä viizi")
+      , (56, "viizikymmendä kuuǯi")
+      , (57, "viizikymmendä seiččemän")
+      , (58, "viizikymmendä kahekšan")
+      , (59, "viizikymmendä yhekšän")
+      , (60, "kuuǯikymmendä")
+      , (61, "kuuǯikymmendä yksi")
+      , (62, "kuuǯikymmendä kakši")
+      , (63, "kuuǯikymmendä kolme")
+      , (64, "kuuǯikymmendä neljjä")
+      , (65, "kuuǯikymmendä viizi")
+      , (66, "kuuǯikymmendä kuuǯi")
+      , (67, "kuuǯikymmendä seiččemän")
+      , (68, "kuuǯikymmendä kahekšan")
+      , (69, "kuuǯikymmendä yhekšän")
+      , (70, "seiččemänkymmendä")
+      , (71, "seiččemänkymmendä yksi")
+      , (72, "seiččemänkymmendä kakši")
+      , (73, "seiččemänkymmendä kolme")
+      , (74, "seiččemänkymmendä neljjä")
+      , (75, "seiččemänkymmendä viizi")
+      , (76, "seiččemänkymmendä kuuǯi")
+      , (77, "seiččemänkymmendä seiččemän")
+      , (78, "seiččemänkymmendä kahekšan")
+      , (79, "seiččemänkymmendä yhekšän")
+      , (80, "kahekšankymmendä")
+      , (81, "kahekšankymmendä yksi")
+      , (82, "kahekšankymmendä kakši")
+      , (83, "kahekšankymmendä kolme")
+      , (84, "kahekšankymmendä neljjä")
+      , (85, "kahekšankymmendä viizi")
+      , (86, "kahekšankymmendä kuuǯi")
+      , (87, "kahekšankymmendä seiččemän")
+      , (88, "kahekšankymmendä kahekšan")
+      , (89, "kahekšankymmendä yhekšän")
+      , (90, "yhekšänkymmendä")
+      , (91, "yhekšänkymmendä yksi")
+      , (92, "yhekšänkymmendä kakši")
+      , (93, "yhekšänkymmendä kolme")
+      , (94, "yhekšänkymmendä neljjä")
+      , (95, "yhekšänkymmendä viizi")
+      , (96, "yhekšänkymmendä kuuǯi")
+      , (97, "yhekšänkymmendä seiččemän")
+      , (98, "yhekšänkymmendä kahekšan")
+      , (99, "yhekšänkymmendä yhekšän")
+      , (100, "šada")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/LA/TestData.hs b/src-test/Text/Numeral/Language/LA/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/LA/TestData.hs
+++ /dev/null
@@ -1,148 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        la
-
-[@ISO639-2B@]       lat
-
-[@ISO639-3@]        lat
-
-[@Native name@]     Latine
-
-[@English name@]    Latin
--}
-
-module Text.Numeral.Language.LA.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.informalmusic.com/latinsoc/latnum.html
-  http://www.sf.airnet.ne.jp/~ts/language/number/latin.html
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "nihil")
-      , (1, "ūnus")
-      , (2, "duo")
-      , (3, "trēs")
-      , (4, "quattuor")
-      , (5, "quīnque")
-      , (6, "sex")
-      , (7, "septem")
-      , (8, "octō")
-      , (9, "novem")
-      , (10, "decem")
-      , (11, "ūndecim")
-      , (12, "duodecim")
-      , (13, "trēdecim")
-      , (14, "quattuordecim")
-      , (15, "quīndecim")
-      , (16, "sēdecim")
-      , (17, "septendecim")
-      , (18, "duodēvīgintī")
-      , (19, "ūndēvīgintī")
-      , (20, "vīgintī")
-      , (21, "vīgintī ūnus")
-      , (22, "vīgintī duo")
-      , (23, "vīgintī trēs")
-      , (24, "vīgintī quattuor")
-      , (25, "vīgintī quīnque")
-      , (26, "vīgintī sex")
-      , (27, "vīgintī septem")
-      , (28, "duodētrīgintā")
-      , (29, "ūndētrīgintā")
-      , (30, "trīgintā")
-      , (31, "trīgintā ūnus")
-      , (32, "trīgintā duo")
-      , (33, "trīgintā trēs")
-      , (34, "trīgintā quattuor")
-      , (35, "trīgintā quīnque")
-      , (36, "trīgintā sex")
-      , (37, "trīgintā septem")
-      , (38, "duodēquadrāgintā")
-      , (39, "ūndēquadrāgintā")
-      , (40, "quadrāgintā")
-      , (41, "quadrāgintā ūnus")
-      , (42, "quadrāgintā duo")
-      , (43, "quadrāgintā trēs")
-      , (44, "quadrāgintā quattuor")
-      , (45, "quadrāgintā quīnque")
-      , (46, "quadrāgintā sex")
-      , (47, "quadrāgintā septem")
-      , (48, "duodēquīnquāgintā")
-      , (49, "ūndēquīnquāgintā")
-      , (50, "quīnquāgintā")
-      , (51, "quīnquāgintā ūnus")
-      , (52, "quīnquāgintā duo")
-      , (53, "quīnquāgintā trēs")
-      , (54, "quīnquāgintā quattuor")
-      , (55, "quīnquāgintā quīnque")
-      , (56, "quīnquāgintā sex")
-      , (57, "quīnquāgintā septem")
-      , (58, "duodēsexāgintā")
-      , (59, "ūndēsexāgintā")
-      , (60, "sexāgintā")
-      , (61, "sexāgintā ūnus")
-      , (62, "sexāgintā duo")
-      , (63, "sexāgintā trēs")
-      , (64, "sexāgintā quattuor")
-      , (65, "sexāgintā quīnque")
-      , (66, "sexāgintā sex")
-      , (67, "sexāgintā septem")
-      , (68, "duodēseptuāgintā")
-      , (69, "ūndēseptuāgintā")
-      , (70, "septuāgintā")
-      , (71, "septuāgintā ūnus")
-      , (72, "septuāgintā duo")
-      , (73, "septuāgintā trēs")
-      , (74, "septuāgintā quattuor")
-      , (75, "septuāgintā quīnque")
-      , (76, "septuāgintā sex")
-      , (77, "septuāgintā septem")
-      , (78, "duodēoctōgintā")
-      , (79, "ūndēoctōgintā")
-      , (80, "octōgintā")
-      , (81, "octōgintā ūnus")
-      , (82, "octōgintā duo")
-      , (83, "octōgintā trēs")
-      , (84, "octōgintā quattuor")
-      , (85, "octōgintā quīnque")
-      , (86, "octōgintā sex")
-      , (87, "octōgintā septem")
-      , (88, "duodēnōnāgintā")
-      , (89, "ūndēnōnāgintā")
-      , (90, "nōnāgintā")
-      , (91, "nōnāgintā ūnus")
-      , (92, "nōnāgintā duo")
-      , (93, "nōnāgintā trēs")
-      , (94, "nōnāgintā quattuor")
-      , (95, "nōnāgintā quīnque")
-      , (96, "nōnāgintā sex")
-      , (97, "nōnāgintā septem")
-      , (98, "duodēcentum")
-      , (99, "ūndēcentum")
-      , (100, "centum")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/LAT/TestData.hs b/src-test/Text/Numeral/Language/LAT/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/LAT/TestData.hs
@@ -0,0 +1,141 @@
+{-|
+[@ISO639-1@]        la
+
+[@ISO639-2B@]       lat
+
+[@ISO639-3@]        lat
+
+[@Native name@]     Latine
+
+[@English name@]    Latin
+-}
+
+module Text.Numeral.Language.LAT.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.informalmusic.com/latinsoc/latnum.html
+  http://www.sf.airnet.ne.jp/~ts/language/number/latin.html
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "nihil")
+      , (1, "ūnus")
+      , (2, "duo")
+      , (3, "trēs")
+      , (4, "quattuor")
+      , (5, "quīnque")
+      , (6, "sex")
+      , (7, "septem")
+      , (8, "octō")
+      , (9, "novem")
+      , (10, "decem")
+      , (11, "ūndecim")
+      , (12, "duodecim")
+      , (13, "trēdecim")
+      , (14, "quattuordecim")
+      , (15, "quīndecim")
+      , (16, "sēdecim")
+      , (17, "septendecim")
+      , (18, "duodēvīgintī")
+      , (19, "ūndēvīgintī")
+      , (20, "vīgintī")
+      , (21, "vīgintī ūnus")
+      , (22, "vīgintī duo")
+      , (23, "vīgintī trēs")
+      , (24, "vīgintī quattuor")
+      , (25, "vīgintī quīnque")
+      , (26, "vīgintī sex")
+      , (27, "vīgintī septem")
+      , (28, "duodētrīgintā")
+      , (29, "ūndētrīgintā")
+      , (30, "trīgintā")
+      , (31, "trīgintā ūnus")
+      , (32, "trīgintā duo")
+      , (33, "trīgintā trēs")
+      , (34, "trīgintā quattuor")
+      , (35, "trīgintā quīnque")
+      , (36, "trīgintā sex")
+      , (37, "trīgintā septem")
+      , (38, "duodēquadrāgintā")
+      , (39, "ūndēquadrāgintā")
+      , (40, "quadrāgintā")
+      , (41, "quadrāgintā ūnus")
+      , (42, "quadrāgintā duo")
+      , (43, "quadrāgintā trēs")
+      , (44, "quadrāgintā quattuor")
+      , (45, "quadrāgintā quīnque")
+      , (46, "quadrāgintā sex")
+      , (47, "quadrāgintā septem")
+      , (48, "duodēquīnquāgintā")
+      , (49, "ūndēquīnquāgintā")
+      , (50, "quīnquāgintā")
+      , (51, "quīnquāgintā ūnus")
+      , (52, "quīnquāgintā duo")
+      , (53, "quīnquāgintā trēs")
+      , (54, "quīnquāgintā quattuor")
+      , (55, "quīnquāgintā quīnque")
+      , (56, "quīnquāgintā sex")
+      , (57, "quīnquāgintā septem")
+      , (58, "duodēsexāgintā")
+      , (59, "ūndēsexāgintā")
+      , (60, "sexāgintā")
+      , (61, "sexāgintā ūnus")
+      , (62, "sexāgintā duo")
+      , (63, "sexāgintā trēs")
+      , (64, "sexāgintā quattuor")
+      , (65, "sexāgintā quīnque")
+      , (66, "sexāgintā sex")
+      , (67, "sexāgintā septem")
+      , (68, "duodēseptuāgintā")
+      , (69, "ūndēseptuāgintā")
+      , (70, "septuāgintā")
+      , (71, "septuāgintā ūnus")
+      , (72, "septuāgintā duo")
+      , (73, "septuāgintā trēs")
+      , (74, "septuāgintā quattuor")
+      , (75, "septuāgintā quīnque")
+      , (76, "septuāgintā sex")
+      , (77, "septuāgintā septem")
+      , (78, "duodēoctōgintā")
+      , (79, "ūndēoctōgintā")
+      , (80, "octōgintā")
+      , (81, "octōgintā ūnus")
+      , (82, "octōgintā duo")
+      , (83, "octōgintā trēs")
+      , (84, "octōgintā quattuor")
+      , (85, "octōgintā quīnque")
+      , (86, "octōgintā sex")
+      , (87, "octōgintā septem")
+      , (88, "duodēnōnāgintā")
+      , (89, "ūndēnōnāgintā")
+      , (90, "nōnāgintā")
+      , (91, "nōnāgintā ūnus")
+      , (92, "nōnāgintā duo")
+      , (93, "nōnāgintā trēs")
+      , (94, "nōnāgintā quattuor")
+      , (95, "nōnāgintā quīnque")
+      , (96, "nōnāgintā sex")
+      , (97, "nōnāgintā septem")
+      , (98, "duodēcentum")
+      , (99, "ūndēcentum")
+      , (100, "centum")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/LAV/TestData.hs b/src-test/Text/Numeral/Language/LAV/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/LAV/TestData.hs
@@ -0,0 +1,239 @@
+{-|
+[@ISO639-1@]        lv
+
+[@ISO639-2@]        lav
+
+[@ISO639-3@]        lav
+
+[@Native name@]     latviešu valoda
+
+[@English name@]    Latvian
+-}
+module Text.Numeral.Language.LAV.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-latvian/en/lav/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "nulle")
+      , (1, "viens")
+      , (2, "divi")
+      , (3, "trīs")
+      , (4, "četri")
+      , (5, "pieci")
+      , (6, "seši")
+      , (7, "septiņi")
+      , (8, "astoņi")
+      , (9, "deviņi")
+      , (10, "desmit")
+      , (11, "vienpadsmit")
+      , (12, "divpadsmit")
+      , (13, "trīspadsmit")
+      , (14, "četrpadsmit")
+      , (15, "piecpadsmit")
+      , (16, "sešpadsmit")
+      , (17, "septiņpadsmit")
+      , (18, "astoņpadsmit")
+      , (19, "deviņpadsmit")
+      , (20, "divdesmit")
+      , (21, "divdesmit viens")
+      , (22, "divdesmit divi")
+      , (23, "divdesmit trīs")
+      , (24, "divdesmit četri")
+      , (25, "divdesmit pieci")
+      , (26, "divdesmit seši")
+      , (27, "divdesmit septiņi")
+      , (28, "divdesmit astoņi")
+      , (29, "divdesmit deviņi")
+      , (30, "trīsdesmit")
+      , (31, "trīsdesmit viens")
+      , (32, "trīsdesmit divi")
+      , (33, "trīsdesmit trīs")
+      , (34, "trīsdesmit četri")
+      , (35, "trīsdesmit pieci")
+      , (36, "trīsdesmit seši")
+      , (37, "trīsdesmit septiņi")
+      , (38, "trīsdesmit astoņi")
+      , (39, "trīsdesmit deviņi")
+      , (40, "četrdesmit")
+      , (41, "četrdesmit viens")
+      , (42, "četrdesmit divi")
+      , (43, "četrdesmit trīs")
+      , (44, "četrdesmit četri")
+      , (45, "četrdesmit pieci")
+      , (46, "četrdesmit seši")
+      , (47, "četrdesmit septiņi")
+      , (48, "četrdesmit astoņi")
+      , (49, "četrdesmit deviņi")
+      , (50, "piecdesmit")
+      , (51, "piecdesmit viens")
+      , (52, "piecdesmit divi")
+      , (53, "piecdesmit trīs")
+      , (54, "piecdesmit četri")
+      , (55, "piecdesmit pieci")
+      , (56, "piecdesmit seši")
+      , (57, "piecdesmit septiņi")
+      , (58, "piecdesmit astoņi")
+      , (59, "piecdesmit deviņi")
+      , (60, "sešdesmit")
+      , (61, "sešdesmit viens")
+      , (62, "sešdesmit divi")
+      , (63, "sešdesmit trīs")
+      , (64, "sešdesmit četri")
+      , (65, "sešdesmit pieci")
+      , (66, "sešdesmit seši")
+      , (67, "sešdesmit septiņi")
+      , (68, "sešdesmit astoņi")
+      , (69, "sešdesmit deviņi")
+      , (70, "septiņdesmit")
+      , (71, "septiņdesmit viens")
+      , (72, "septiņdesmit divi")
+      , (73, "septiņdesmit trīs")
+      , (74, "septiņdesmit četri")
+      , (75, "septiņdesmit pieci")
+      , (76, "septiņdesmit seši")
+      , (77, "septiņdesmit septiņi")
+      , (78, "septiņdesmit astoņi")
+      , (79, "septiņdesmit deviņi")
+      , (80, "astoņdesmit")
+      , (81, "astoņdesmit viens")
+      , (82, "astoņdesmit divi")
+      , (83, "astoņdesmit trīs")
+      , (84, "astoņdesmit četri")
+      , (85, "astoņdesmit pieci")
+      , (86, "astoņdesmit seši")
+      , (87, "astoņdesmit septiņi")
+      , (88, "astoņdesmit astoņi")
+      , (89, "astoņdesmit deviņi")
+      , (90, "deviņdesmit")
+      , (91, "deviņdesmit viens")
+      , (92, "deviņdesmit divi")
+      , (93, "deviņdesmit trīs")
+      , (94, "deviņdesmit četri")
+      , (95, "deviņdesmit pieci")
+      , (96, "deviņdesmit seši")
+      , (97, "deviņdesmit septiņi")
+      , (98, "deviņdesmit astoņi")
+      , (99, "deviņdesmit deviņi")
+      , (100, "simts")
+      , (101, "simt viens")
+      , (102, "simt divi")
+      , (103, "simt trīs")
+      , (104, "simt četri")
+      , (105, "simt pieci")
+      , (106, "simt seši")
+      , (107, "simt septiņi")
+      , (108, "simt astoņi")
+      , (109, "simt deviņi")
+      , (110, "simt desmit")
+      , (123, "simt divdesmit trīs")
+      , (200, "divsimt")
+      , (300, "trīssimt")
+      , (321, "trīssimt divdesmit viens")
+      , (400, "četrsimt")
+      , (500, "piecsimt")
+      , (600, "sešsimt")
+      , (700, "septiņsimt")
+      , (800, "astoņsimt")
+      , (900, "deviņsimt")
+      , (909, "deviņsimt deviņi")
+      , (990, "deviņsimt deviņdesmit")
+      , (999, "deviņsimt deviņdesmit deviņi")
+      , (1000, "tūkstoš")
+      , (1001, "tūkstoš viens")
+      , (1008, "tūkstoš astoņi")
+      , (1234, "tūkstoš divsimt trīsdesmit četri")
+      , (2000, "divtūkstoši")
+      , (3000, "trīstūkstoši")
+      , (4000, "četrtūkstoši")
+      , (4321, "četrtūkstoši trīssimt divdesmit viens")
+      , (5000, "piectūkstoši")
+      , (6000, "seštūkstoši")
+      , (7000, "septiņtūkstoši")
+      , (8000, "astoņtūkstoši")
+      , (9000, "deviņtūkstoši")
+      , (10000, "desmit tūkstošu")
+      , (12345, "divpadsmit tūkstoši trīssimt četrdesmit pieci")
+      , (20000, "divdesmit tūkstošu")
+      , (30000, "trīsdesmit tūkstošu")
+      , (40000, "četrdesmit tūkstošu")
+      , (50000, "piecdesmit tūkstošu")
+      , (54321, "piecdesmit četrtūkstoši trīssimt divdesmit viens")
+      , (60000, "sešdesmit tūkstošu")
+      , (70000, "septiņdesmit tūkstošu")
+      , (80000, "astoņdesmit tūkstošu")
+      , (90000, "deviņdesmit tūkstošu")
+      , (100000, "simt tūkstošu")
+      , (123456, "simt divdesmit trīstūkstoši četrsimt piecdesmit seši")
+      , (200000, "divsimt tūkstošu")
+      , (300000, "trīssimt tūkstošu")
+      , (400000, "četrsimt tūkstošu")
+      , (500000, "piecsimt tūkstošu")
+      , (600000, "sešsimt tūkstošu")
+      , (654321, "sešsimt piecdesmit četrtūkstoši trīssimt divdesmit viens")
+      , (700000, "septiņsimt tūkstošu")
+      , (800000, "astoņsimt tūkstošu")
+      , (900000, "deviņsimt tūkstošu")
+      , (1000000, "miljons")
+      , (1000001, "miljons viens")
+      , (1234567, "miljons divsimt trīsdesmit četrtūkstoši piecsimt sešdesmit septiņi")
+      , (2000000, "divi miljonu")
+      , (3000000, "trīs miljonu")
+      , (4000000, "četri miljonu")
+      , (5000000, "pieci miljonu")
+      , (6000000, "seši miljonu")
+      , (7000000, "septiņi miljonu")
+      , (7654321, "septiņi miljonu sešsimt piecdesmit četrtūkstoši trīssimt divdesmit viens")
+      , (8000000, "astoņi miljonu")
+      , (9000000, "deviņi miljonu")
+      , (1000000000, "miljards")
+      , (1000000001, "miljards viens")
+      , (2000000000, "divi miljardu")
+      , (3000000000, "trīs miljardu")
+      , (4000000000, "četri miljardu")
+      , (5000000000, "pieci miljardu")
+      , (6000000000, "seši miljardu")
+      , (7000000000, "septiņi miljardu")
+      , (8000000000, "astoņi miljardu")
+      , (9000000000, "deviņi miljardu")
+      , (1000000000000, "triljons")
+      , (1000000000001, "triljons viens")
+      , (2000000000000, "divi triljonu")
+      , (3000000000000, "trīs triljonu")
+      , (4000000000000, "četri triljonu")
+      , (5000000000000, "pieci triljonu")
+      , (6000000000000, "seši triljonu")
+      , (7000000000000, "septiņi triljonu")
+      , (8000000000000, "astoņi triljonu")
+      , (9000000000000, "deviņi triljonu")
+      , (1000000000000000, "kvadriljons")
+      , (1000000000000001, "kvadriljons viens")
+      , (2000000000000000, "divi kvadriljonu")
+      , (3000000000000000, "trīs kvadriljonu")
+      , (4000000000000000, "četri kvadriljonu")
+      , (5000000000000000, "pieci kvadriljonu")
+      , (6000000000000000, "seši kvadriljonu")
+      , (7000000000000000, "septiņi kvadriljonu")
+      , (8000000000000000, "astoņi kvadriljonu")
+      , (9000000000000000, "deviņi kvadriljonu")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/LIN/TestData.hs b/src-test/Text/Numeral/Language/LIN/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/LIN/TestData.hs
@@ -0,0 +1,175 @@
+{-|
+[@ISO639-1@]        ln
+
+[@ISO639-2@]        lin
+
+[@ISO639-3@]        lin
+
+[@Native name@]     Ngala
+
+[@English name@]    Lingala
+-}
+module Text.Numeral.Language.LIN.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-lingala/en/lin/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "libungutulu")
+      , (1, "mókó")
+      , (2, "míbalé")
+      , (3, "mísáto")
+      , (4, "mínei")
+      , (5, "mítáno")
+      , (6, "motóba")
+      , (7, "sámbó")
+      , (8, "mwámbe")
+      , (9, "libwá")
+      , (10, "zómi")
+      , (11, "zómi na mókó")
+      , (12, "zómi na míbalé")
+      , (13, "zómi na mísáto")
+      , (14, "zómi na mínei")
+      , (15, "zómi na mítáno")
+      , (16, "zómi na motóba")
+      , (17, "zómi na sámbó")
+      , (18, "zómi na mwámbe")
+      , (19, "zómi na libwá")
+      , (20, "ntúkú míbalé")
+      , (21, "ntúkú míbalé na mókó")
+      , (22, "ntúkú míbalé na míbalé")
+      , (23, "ntúkú míbalé na mísáto")
+      , (24, "ntúkú míbalé na mínei")
+      , (25, "ntúkú míbalé na mítáno")
+      , (26, "ntúkú míbalé na motóba")
+      , (27, "ntúkú míbalé na sámbó")
+      , (28, "ntúkú míbalé na mwámbe")
+      , (29, "ntúkú míbalé na libwá")
+      , (30, "ntúkú mísáto")
+      , (31, "ntúkú mísáto na mókó")
+      , (32, "ntúkú mísáto na míbalé")
+      , (33, "ntúkú mísáto na mísáto")
+      , (34, "ntúkú mísáto na mínei")
+      , (35, "ntúkú mísáto na mítáno")
+      , (36, "ntúkú mísáto na motóba")
+      , (37, "ntúkú mísáto na sámbó")
+      , (38, "ntúkú mísáto na mwámbe")
+      , (39, "ntúkú mísáto na libwá")
+      , (40, "ntúkú mínei")
+      , (41, "ntúkú mínei na mókó")
+      , (42, "ntúkú mínei na míbalé")
+      , (43, "ntúkú mínei na mísáto")
+      , (44, "ntúkú mínei na mínei")
+      , (45, "ntúkú mínei na mítáno")
+      , (46, "ntúkú mínei na motóba")
+      , (47, "ntúkú mínei na sámbó")
+      , (48, "ntúkú mínei na mwámbe")
+      , (49, "ntúkú mínei na libwá")
+      , (50, "ntúkú mítáno")
+      , (51, "ntúkú mítáno na mókó")
+      , (52, "ntúkú mítáno na míbalé")
+      , (53, "ntúkú mítáno na mísáto")
+      , (54, "ntúkú mítáno na mínei")
+      , (55, "ntúkú mítáno na mítáno")
+      , (56, "ntúkú mítáno na motóba")
+      , (57, "ntúkú mítáno na sámbó")
+      , (58, "ntúkú mítáno na mwámbe")
+      , (59, "ntúkú mítáno na libwá")
+      , (60, "ntúkú motóba")
+      , (61, "ntúkú motóba na mókó")
+      , (62, "ntúkú motóba na míbalé")
+      , (63, "ntúkú motóba na mísáto")
+      , (64, "ntúkú motóba na mínei")
+      , (65, "ntúkú motóba na mítáno")
+      , (66, "ntúkú motóba na motóba")
+      , (67, "ntúkú motóba na sámbó")
+      , (68, "ntúkú motóba na mwámbe")
+      , (69, "ntúkú motóba na libwá")
+      , (70, "ntúkú sámbó")
+      , (71, "ntúkú sámbó na mókó")
+      , (72, "ntúkú sámbó na míbalé")
+      , (73, "ntúkú sámbó na mísáto")
+      , (74, "ntúkú sámbó na mínei")
+      , (75, "ntúkú sámbó na mítáno")
+      , (76, "ntúkú sámbó na motóba")
+      , (77, "ntúkú sámbó na sámbó")
+      , (78, "ntúkú sámbó na mwámbe")
+      , (79, "ntúkú sámbó na libwá")
+      , (80, "ntúkú mwámbe")
+      , (81, "ntúkú mwámbe na mókó")
+      , (82, "ntúkú mwámbe na míbalé")
+      , (83, "ntúkú mwámbe na mísáto")
+      , (84, "ntúkú mwámbe na mínei")
+      , (85, "ntúkú mwámbe na mítáno")
+      , (86, "ntúkú mwámbe na motóba")
+      , (87, "ntúkú mwámbe na sámbó")
+      , (88, "ntúkú mwámbe na mwámbe")
+      , (89, "ntúkú mwámbe na libwá")
+      , (90, "ntúkú libwá")
+      , (91, "ntúkú libwá na mókó")
+      , (92, "ntúkú libwá na míbalé")
+      , (93, "ntúkú libwá na mísáto")
+      , (94, "ntúkú libwá na mínei")
+      , (95, "ntúkú libwá na mítáno")
+      , (96, "ntúkú libwá na motóba")
+      , (97, "ntúkú libwá na sámbó")
+      , (98, "ntúkú libwá na mwámbe")
+      , (99, "ntúkú libwá na libwá")
+      , (100, "nkámá")
+      , (101, "nkámá mókó na mókó")
+      , (102, "nkámá mókó na míbalé")
+      , (103, "nkámá mókó na mísáto")
+      , (104, "nkámá mókó na mínei")
+      , (105, "nkámá mókó na mítáno")
+      , (106, "nkámá mókó na motóba")
+      , (107, "nkámá mókó na sámbó")
+      , (108, "nkámá mókó na mwámbe")
+      , (109, "nkámá mókó na libwá")
+      , (110, "nkámá mókó na zómi")
+      , (123, "nkámá mókó na ntúkú míbalé na mísáto")
+      , (200, "nkámá míbalé")
+      , (300, "nkámá mísáto")
+      , (321, "nkámá mísáto na ntúkú míbalé na mókó")
+      , (400, "nkámá mínei")
+      , (500, "nkámá mítáno")
+      , (600, "nkámá motóba")
+      , (700, "nkámá sámbó")
+      , (800, "nkámá mwámbe")
+      , (900, "nkámá libwá")
+      , (909, "nkámá libwá na libwá")
+      , (990, "nkámá libwá na ntúkú libwá")
+      , (999, "nkámá libwá na ntúkú libwá na libwá")
+      , (1000, "nkóto")
+      , (1001, "nkóto mókó na mókó")
+      , (1008, "nkóto mókó na mwámbe")
+      , (1234, "nkóto mókó na nkámá míbalé na ntúkú mísáto na mínei")
+      , (2000, "nkóto míbalé")
+      , (3000, "nkóto mísáto")
+      , (4000, "nkóto mínei")
+      , (4321, "nkóto mínei na nkámá mísáto na ntúkú míbalé na mókó")
+      , (5000, "nkóto mítáno")
+      , (6000, "nkóto motóba")
+      , (7000, "nkóto sámbó")
+      , (8000, "nkóto mwámbe")
+      , (9000, "nkóto libwá")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/LIT/TestData.hs b/src-test/Text/Numeral/Language/LIT/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/LIT/TestData.hs
@@ -0,0 +1,291 @@
+{-|
+[@ISO639-1@]        lt
+
+[@ISO639-2@]        lit
+
+[@ISO639-3@]        lit
+
+[@Native name@]     lietuvių kalba
+
+[@English name@]    Lithuanian
+-}
+module Text.Numeral.Language.LIT.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Prelude ( Integral, (+) )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-lithuanian/en/lit/
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "nulis")
+      , (1, "vienas")
+      , (2, "du")
+      , (3, "trys")
+      , (4, "keturi")
+      , (5, "penki")
+      , (6, "šeši")
+      , (7, "septyni")
+      , (8, "aštuoni")
+      , (9, "devyni")
+      , (10, "dešimt")
+      , (11, "vienuolika")
+      , (12, "dvylika")
+      , (13, "trylika")
+      , (14, "keturiolika")
+      , (15, "penkiolika")
+      , (16, "šešiolika")
+      , (17, "septyniolika")
+      , (18, "aštuoniolika")
+      , (19, "devyniolika")
+      , (20, "dvidešimt")
+      , (21, "dvidešimt vienas")
+      , (22, "dvidešimt du")
+      , (23, "dvidešimt trys")
+      , (24, "dvidešimt keturi")
+      , (25, "dvidešimt penki")
+      , (26, "dvidešimt šeši")
+      , (27, "dvidešimt septyni")
+      , (28, "dvidešimt aštuoni")
+      , (29, "dvidešimt devyni")
+      , (30, "trisdešimt")
+      , (31, "trisdešimt vienas")
+      , (32, "trisdešimt du")
+      , (33, "trisdešimt trys")
+      , (34, "trisdešimt keturi")
+      , (35, "trisdešimt penki")
+      , (36, "trisdešimt šeši")
+      , (37, "trisdešimt septyni")
+      , (38, "trisdešimt aštuoni")
+      , (39, "trisdešimt devyni")
+      , (40, "keturiasdešimt")
+      , (41, "keturiasdešimt vienas")
+      , (42, "keturiasdešimt du")
+      , (43, "keturiasdešimt trys")
+      , (44, "keturiasdešimt keturi")
+      , (45, "keturiasdešimt penki")
+      , (46, "keturiasdešimt šeši")
+      , (47, "keturiasdešimt septyni")
+      , (48, "keturiasdešimt aštuoni")
+      , (49, "keturiasdešimt devyni")
+      , (50, "penkiasdešimt")
+      , (51, "penkiasdešimt vienas")
+      , (52, "penkiasdešimt du")
+      , (53, "penkiasdešimt trys")
+      , (54, "penkiasdešimt keturi")
+      , (55, "penkiasdešimt penki")
+      , (56, "penkiasdešimt šeši")
+      , (57, "penkiasdešimt septyni")
+      , (58, "penkiasdešimt aštuoni")
+      , (59, "penkiasdešimt devyni")
+      , (60, "šešiasdešimt")
+      , (61, "šešiasdešimt vienas")
+      , (62, "šešiasdešimt du")
+      , (63, "šešiasdešimt trys")
+      , (64, "šešiasdešimt keturi")
+      , (65, "šešiasdešimt penki")
+      , (66, "šešiasdešimt šeši")
+      , (67, "šešiasdešimt septyni")
+      , (68, "šešiasdešimt aštuoni")
+      , (69, "šešiasdešimt devyni")
+      , (70, "septyniasdešimt")
+      , (71, "septyniasdešimt vienas")
+      , (72, "septyniasdešimt du")
+      , (73, "septyniasdešimt trys")
+      , (74, "septyniasdešimt keturi")
+      , (75, "septyniasdešimt penki")
+      , (76, "septyniasdešimt šeši")
+      , (77, "septyniasdešimt septyni")
+      , (78, "septyniasdešimt aštuoni")
+      , (79, "septyniasdešimt devyni")
+      , (80, "aštuoniasdešimt")
+      , (81, "aštuoniasdešimt vienas")
+      , (82, "aštuoniasdešimt du")
+      , (83, "aštuoniasdešimt trys")
+      , (84, "aštuoniasdešimt keturi")
+      , (85, "aštuoniasdešimt penki")
+      , (86, "aštuoniasdešimt šeši")
+      , (87, "aštuoniasdešimt septyni")
+      , (88, "aštuoniasdešimt aštuoni")
+      , (89, "aštuoniasdešimt devyni")
+      , (90, "devyniasdešimt")
+      , (91, "devyniasdešimt vienas")
+      , (92, "devyniasdešimt du")
+      , (93, "devyniasdešimt trys")
+      , (94, "devyniasdešimt keturi")
+      , (95, "devyniasdešimt penki")
+      , (96, "devyniasdešimt šeši")
+      , (97, "devyniasdešimt septyni")
+      , (98, "devyniasdešimt aštuoni")
+      , (99, "devyniasdešimt devyni")
+      , (100, "šimtas")
+      , (101, "šimtas vienas")
+      , (102, "šimtas du")
+      , (103, "šimtas trys")
+      , (104, "šimtas keturi")
+      , (105, "šimtas penki")
+      , (106, "šimtas šeši")
+      , (107, "šimtas septyni")
+      , (108, "šimtas aštuoni")
+      , (109, "šimtas devyni")
+      , (110, "šimtas dešimt")
+      , (123, "šimtas dvidešimt trys")
+      , (200, "du šimtai")
+      , (300, "trys šimtai")
+      , (321, "trys šimtai dvidešimt vienas")
+      , (400, "keturi šimtai")
+      , (500, "penki šimtai")
+      , (600, "šeši šimtai")
+      , (700, "septyni šimtai")
+      , (800, "aštuoni šimtai")
+      , (900, "devyni šimtai")
+      , (909, "devyni šimtai devyni")
+      , (990, "devyni šimtai devyniasdešimt")
+      , (999, "devyni šimtai devyniasdešimt devyni")
+      , (1000, "tūkstantis")
+      , (1001, "tūkstantis vienas")
+      , (1008, "tūkstantis aštuoni")
+      , (1234, "tūkstantis du šimtai trisdešimt keturi")
+      , (2000, "du tūkstančiai")
+      , (3000, "trys tūkstančiai")
+      , (4000, "keturi tūkstančiai")
+      , (4321, "keturi tūkstančiai trys šimtai dvidešimt vienas")
+      , (5000, "penki tūkstančiai")
+      , (6000, "šeši tūkstančiai")
+      , (7000, "septyni tūkstančiai")
+      , (8000, "aštuoni tūkstančiai")
+      , (9000, "devyni tūkstančiai")
+      , (10000, "dešimt tūkstančiai")
+      , (12345, "dvylika tūkstančiai trys šimtai keturiasdešimt penki")
+      , (20000, "dvidešimt tūkstančiai")
+      , (30000, "trisdešimt tūkstančiai")
+      , (40000, "keturiasdešimt tūkstančiai")
+      , (50000, "penkiasdešimt tūkstančiai")
+      , (54321, "penkiasdešimt keturi tūkstančiai trys šimtai dvidešimt vienas")
+      , (60000, "šešiasdešimt tūkstančiai")
+      , (70000, "septyniasdešimt tūkstančiai")
+      , (80000, "aštuoniasdešimt tūkstančiai")
+      , (90000, "devyniasdešimt tūkstančiai")
+      , (100000, "šimtas tūkstančiai")
+      , (123456, "šimtas dvidešimt trys tūkstančiai keturi šimtai penkiasdešimt šeši")
+      , (200000, "du šimtai tūkstančiai")
+      , (300000, "trys šimtai tūkstančiai")
+      , (400000, "keturi šimtai tūkstančiai")
+      , (500000, "penki šimtai tūkstančiai")
+      , (600000, "šeši šimtai tūkstančiai")
+      , (654321, "šeši šimtai penkiasdešimt keturi tūkstančiai trys šimtai dvidešimt vienas")
+      , (700000, "septyni šimtai tūkstančiai")
+      , (800000, "aštuoni šimtai tūkstančiai")
+      , (900000, "devyni šimtai tūkstančiai")
+      , (1000000, "milijonas")
+      , (1000001, "milijonas vienas")
+      , (1234567, "milijonas du šimtai trisdešimt keturi tūkstančiai penki šimtai šešiasdešimt septyni")
+      , (2000000, "du milijonai")
+      , (3000000, "trys milijonai")
+      , (4000000, "keturi milijonai")
+      , (5000000, "penki milijonai")
+      , (6000000, "šeši milijonai")
+      , (7000000, "septyni milijonai")
+      , (7654321, "septyni milijonai šeši šimtai penkiasdešimt keturi tūkstančiai trys šimtai dvidešimt vienas")
+      , (8000000, "aštuoni milijonai")
+      , (9000000, "devyni milijonai")
+      , (dec 9, "milijardas")
+      , (dec 9 + 1, "milijardas vienas")
+      , (2 * dec 9, "du milijardai")
+      , (3 * dec 9, "trys milijardai")
+      , (4 * dec 9, "keturi milijardai")
+      , (5 * dec 9, "penki milijardai")
+      , (6 * dec 9, "šeši milijardai")
+      , (7 * dec 9, "septyni milijardai")
+      , (8 * dec 9, "aštuoni milijardai")
+      , (9 * dec 9, "devyni milijardai")
+      , (dec 12, "trilijonas")
+      , (dec 12 + 1, "trilijonas vienas")
+      , (2 * dec 12, "du trilijonai")
+      , (3 * dec 12, "trys trilijonai")
+      , (4 * dec 12, "keturi trilijonai")
+      , (5 * dec 12, "penki trilijonai")
+      , (6 * dec 12, "šeši trilijonai")
+      , (7 * dec 12, "septyni trilijonai")
+      , (8 * dec 12, "aštuoni trilijonai")
+      , (9 * dec 12, "devyni trilijonai")
+      , (dec 15, "kvadrilijonas")
+      , (dec 15 + 1, "kvadrilijonas vienas")
+      , (2 * dec 15, "du kvadrilijonai")
+      , (3 * dec 15, "trys kvadrilijonai")
+      , (4 * dec 15, "keturi kvadrilijonai")
+      , (5 * dec 15, "penki kvadrilijonai")
+      , (6 * dec 15, "šeši kvadrilijonai")
+      , (7 * dec 15, "septyni kvadrilijonai")
+      , (8 * dec 15, "aštuoni kvadrilijonai")
+      , (9 * dec 15, "devyni kvadrilijonai")
+      , (dec 18, "kvintilijonas")
+      , (dec 18 + 1, "kvintilijonas vienas")
+      , (2 * dec 18, "du kvintilijonai")
+      , (3 * dec 18, "trys kvintilijonai")
+      , (4 * dec 18, "keturi kvintilijonai")
+      , (5 * dec 18, "penki kvintilijonai")
+      , (6 * dec 18, "šeši kvintilijonai")
+      , (7 * dec 18, "septyni kvintilijonai")
+      , (8 * dec 18, "aštuoni kvintilijonai")
+      , (9 * dec 18, "devyni kvintilijonai")
+      , (dec 21, "sikstilijonas")
+      , (dec 21 + 1, "sikstilijonas vienas")
+      , (2 * dec 21, "du sikstilijonai")
+      , (3 * dec 21, "trys sikstilijonai")
+      , (4 * dec 21, "keturi sikstilijonai")
+      , (5 * dec 21, "penki sikstilijonai")
+      , (6 * dec 21, "šeši sikstilijonai")
+      , (7 * dec 21, "septyni sikstilijonai")
+      , (8 * dec 21, "aštuoni sikstilijonai")
+      , (9 * dec 21, "devyni sikstilijonai")
+      , (dec 24, "septilijonas")
+      , (dec 24 + 1, "septilijonas vienas")
+      , (2 * dec 24, "du septilijonai")
+      , (3 * dec 24, "trys septilijonai")
+      , (4 * dec 24, "keturi septilijonai")
+      , (5 * dec 24, "penki septilijonai")
+      , (6 * dec 24, "šeši septilijonai")
+      , (7 * dec 24, "septyni septilijonai")
+      , (8 * dec 24, "aštuoni septilijonai")
+      , (9 * dec 24, "devyni septilijonai")
+      , (dec 27, "oktilijonas")
+      , (dec 27 + 1, "oktilijonas vienas")
+      , (2 * dec 27, "du oktilijonai")
+      , (3 * dec 27, "trys oktilijonai")
+      , (4 * dec 27, "keturi oktilijonai")
+      , (5 * dec 27, "penki oktilijonai")
+      , (6 * dec 27, "šeši oktilijonai")
+      , (7 * dec 27, "septyni oktilijonai")
+      , (8 * dec 27, "aštuoni oktilijonai")
+      , (9 * dec 27, "devyni oktilijonai")
+      , (dec 30, "naintilijonas")
+      , (dec 30 + 1, "naintilijonas vienas")
+      , (2 * dec 30, "du naintilijonai")
+      , (3 * dec 30, "trys naintilijonai")
+      , (4 * dec 30, "keturi naintilijonai")
+      , (5 * dec 30, "penki naintilijonai")
+      , (6 * dec 30, "šeši naintilijonai")
+      , (7 * dec 30, "septyni naintilijonai")
+      , (8 * dec 30, "aštuoni naintilijonai")
+      , (9 * dec 30, "devyni naintilijonai")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/LIV/TestData.hs b/src-test/Text/Numeral/Language/LIV/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/LIV/TestData.hs
@@ -0,0 +1,209 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        liv
+
+[@Native name@]     līvõ kēļ
+
+[@English name@]    Livonian
+-}
+module Text.Numeral.Language.LIV.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-livonian/en/liv/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "null")
+      , (1, "ikš")
+      , (2, "kakš")
+      , (3, "kuolm")
+      , (4, "nēļa")
+      , (5, "vīž")
+      , (6, "kūž")
+      , (7, "seis")
+      , (8, "kōdõks")
+      , (9, "īdõks")
+      , (10, "kim")
+      , (11, "ikštuoistõn")
+      , (12, "kakštuoistõn")
+      , (13, "kuolmtuoistõn")
+      , (14, "nēļatuoistõn")
+      , (15, "vīžtuoistõn")
+      , (16, "kūžtuoistõn")
+      , (17, "seistuoistõn")
+      , (18, "kōdõkstuoistõn")
+      , (19, "īdõkstuoistõn")
+      , (20, "kakškimdõ")
+      , (21, "kakškimdõ ikš")
+      , (22, "kakškimdõ kakš")
+      , (23, "kakškimdõ kuolm")
+      , (24, "kakškimdõ nēļa")
+      , (25, "kakškimdõ vīž")
+      , (26, "kakškimdõ kūž")
+      , (27, "kakškimdõ seis")
+      , (28, "kakškimdõ kōdõks")
+      , (29, "kakškimdõ īdõks")
+      , (30, "kuolmkimdõ")
+      , (31, "kuolmkimdõ ikš")
+      , (32, "kuolmkimdõ kakš")
+      , (33, "kuolmkimdõ kuolm")
+      , (34, "kuolmkimdõ nēļa")
+      , (35, "kuolmkimdõ vīž")
+      , (36, "kuolmkimdõ kūž")
+      , (37, "kuolmkimdõ seis")
+      , (38, "kuolmkimdõ kōdõks")
+      , (39, "kuolmkimdõ īdõks")
+      , (40, "nēļakimdõ")
+      , (41, "nēļakimdõ ikš")
+      , (42, "nēļakimdõ kakš")
+      , (43, "nēļakimdõ kuolm")
+      , (44, "nēļakimdõ nēļa")
+      , (45, "nēļakimdõ vīž")
+      , (46, "nēļakimdõ kūž")
+      , (47, "nēļakimdõ seis")
+      , (48, "nēļakimdõ kōdõks")
+      , (49, "nēļakimdõ īdõks")
+      , (50, "vīžkimdõ")
+      , (51, "vīžkimdõ ikš")
+      , (52, "vīžkimdõ kakš")
+      , (53, "vīžkimdõ kuolm")
+      , (54, "vīžkimdõ nēļa")
+      , (55, "vīžkimdõ vīž")
+      , (56, "vīžkimdõ kūž")
+      , (57, "vīžkimdõ seis")
+      , (58, "vīžkimdõ kōdõks")
+      , (59, "vīžkimdõ īdõks")
+      , (60, "kūžkimdõ")
+      , (61, "kūžkimdõ ikš")
+      , (62, "kūžkimdõ kakš")
+      , (63, "kūžkimdõ kuolm")
+      , (64, "kūžkimdõ nēļa")
+      , (65, "kūžkimdõ vīž")
+      , (66, "kūžkimdõ kūž")
+      , (67, "kūžkimdõ seis")
+      , (68, "kūžkimdõ kōdõks")
+      , (69, "kūžkimdõ īdõks")
+      , (70, "seiskimdõ")
+      , (71, "seiskimdõ ikš")
+      , (72, "seiskimdõ kakš")
+      , (73, "seiskimdõ kuolm")
+      , (74, "seiskimdõ nēļa")
+      , (75, "seiskimdõ vīž")
+      , (76, "seiskimdõ kūž")
+      , (77, "seiskimdõ seis")
+      , (78, "seiskimdõ kōdõks")
+      , (79, "seiskimdõ īdõks")
+      , (80, "kōdõkskimdõ")
+      , (81, "kōdõkskimdõ ikš")
+      , (82, "kōdõkskimdõ kakš")
+      , (83, "kōdõkskimdõ kuolm")
+      , (84, "kōdõkskimdõ nēļa")
+      , (85, "kōdõkskimdõ vīž")
+      , (86, "kōdõkskimdõ kūž")
+      , (87, "kōdõkskimdõ seis")
+      , (88, "kōdõkskimdõ kōdõks")
+      , (89, "kōdõkskimdõ īdõks")
+      , (90, "īdõkskimdõ")
+      , (91, "īdõkskimdõ ikš")
+      , (92, "īdõkskimdõ kakš")
+      , (93, "īdõkskimdõ kuolm")
+      , (94, "īdõkskimdõ nēļa")
+      , (95, "īdõkskimdõ vīž")
+      , (96, "īdõkskimdõ kūž")
+      , (97, "īdõkskimdõ seis")
+      , (98, "īdõkskimdõ kōdõks")
+      , (99, "īdõkskimdõ īdõks")
+      , (100, "sadā")
+      , (101, "sadā ikš")
+      , (102, "sadā kakš")
+      , (103, "sadā kuolm")
+      , (104, "sadā nēļa")
+      , (105, "sadā vīž")
+      , (106, "sadā kūž")
+      , (107, "sadā seis")
+      , (108, "sadā kōdõks")
+      , (109, "sadā īdõks")
+      , (110, "sadā kim")
+      , (123, "sadā kakškimdõ kuolm")
+      , (200, "kakš saddõ")
+      , (300, "kuolm saddõ")
+      , (321, "kuolm saddõ kakškimdõ ikš")
+      , (400, "nēļa saddõ")
+      , (500, "vīž saddõ")
+      , (600, "kūž saddõ")
+      , (700, "seis saddõ")
+      , (800, "kōdõks saddõ")
+      , (900, "īdõks saddõ")
+      , (909, "īdõks saddõ īdõks")
+      , (990, "īdõks saddõ īdõkskimdõ")
+      , (999, "īdõks saddõ īdõkskimdõ īdõks")
+      , (1000, "tūontõ")
+      , (1001, "tūontõ ikš")
+      , (1008, "tūontõ kōdõks")
+      , (1234, "tūontõ kakš saddõ kuolmkimdõ nēļa")
+      , (2000, "kakš tūontõd")
+      , (3000, "kuolm tūontõd")
+      , (4000, "nēļa tūontõd")
+      , (4321, "nēļa tūontõd kuolm saddõ kakškimdõ ikš")
+      , (5000, "vīž tūontõd")
+      , (6000, "kūž tūontõd")
+      , (7000, "seis tūontõd")
+      , (8000, "kōdõks tūontõd")
+      , (9000, "īdõks tūontõd")
+      , (10000, "kim tūontõd")
+      , (12345, "kakštuoistõn tūontõd kuolm saddõ nēļakimdõ vīž")
+      , (20000, "kakškimdõ tūontõd")
+      , (30000, "kuolmkimdõ tūontõd")
+      , (40000, "nēļakimdõ tūontõd")
+      , (50000, "vīžkimdõ tūontõd")
+      , (54321, "vīžkimdõ nēļa tūontõd kuolm saddõ kakškimdõ ikš")
+      , (60000, "kūžkimdõ tūontõd")
+      , (70000, "seiskimdõ tūontõd")
+      , (80000, "kōdõkskimdõ tūontõd")
+      , (90000, "īdõkskimdõ tūontõd")
+      , (100000, "sadā tūontõd")
+      , (123456, "sadā kakškimdõ kuolm tūontõd nēļa saddõ vīžkimdõ kūž")
+      , (200000, "kakš saddõ tūontõd")
+      , (300000, "kuolm saddõ tūontõd")
+      , (400000, "nēļa saddõ tūontõd")
+      , (500000, "vīž saddõ tūontõd")
+      , (600000, "kūž saddõ tūontõd")
+      , (654321, "kūž saddõ vīžkimdõ nēļa tūontõd kuolm saddõ kakškimdõ ikš")
+      , (700000, "seis saddõ tūontõd")
+      , (800000, "kōdõks saddõ tūontõd")
+      , (900000, "īdõks saddõ tūontõd")
+      , (1000000, "miljon")
+      , (1000001, "miljon ikš")
+      , (1234567, "miljon kakš saddõ kuolmkimdõ nēļa tūontõd vīž saddõ kūžkimdõ seis")
+      , (2000000, "kakš miljonõd")
+      , (3000000, "kuolm miljonõd")
+      , (4000000, "nēļa miljonõd")
+      , (5000000, "vīž miljonõd")
+      , (6000000, "kūž miljonõd")
+      , (7000000, "seis miljonõd")
+      , (7654321, "seis miljonõd kūž saddõ vīžkimdõ nēļa tūontõd kuolm saddõ kakškimdõ ikš")
+      , (8000000, "kōdõks miljonõd")
+      , (9000000, "īdõks miljonõd")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/LLD/TestData.hs b/src-test/Text/Numeral/Language/LLD/TestData.hs
--- a/src-test/Text/Numeral/Language/LLD/TestData.hs
+++ b/src-test/Text/Numeral/Language/LLD/TestData.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -24,9 +18,8 @@
 --------------------------------------------------------------------------------
 
 import "base" Prelude     ( Integral, (+) )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
 import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "numerals" Text.Numeral.Misc ( dec )
 import "this" Text.Numeral.Test ( TestData )
 
@@ -37,7 +30,7 @@
 
 -- Sources:
 --   http://www.languagesandnumbers.com/how-to-count-in-ladin/en/lld/
-cardinals ∷ (Integral i) ⇒ TestData i
+cardinals :: (Integral i) => TestData i
 cardinals =
   [ ( "masculine"
     , masculine defaultInflection
@@ -138,10 +131,10 @@
       , (12345, "dodescmiletreicentecarantecinch")
       , (dec 6, "un milion")
       , (dec 6 + 1, "un milioneun")
-      , (2 ⋅ dec 6, "doi milion")
+      , (2 * dec 6, "doi milion")
       , (123456789, "centevintetrei milionecatercentecincantesiesmilesetcenteotantenuef")
       , (dec 9, "un miliard")
-      , (2 ⋅ dec 9, "doi miliard")
+      , (2 * dec 9, "doi miliard")
       , (9876543210, "nuef miliardeotcentesetantesies milionecinchcentecarantetreimiledoicentediesc")
       , (9999999999, "nuef miliardenuefcentenonantenuef milionenuefcentenonantenuefmilenuefcentenonantenuef")
       ]
diff --git a/src-test/Text/Numeral/Language/LMO/TestData.hs b/src-test/Text/Numeral/Language/LMO/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/LMO/TestData.hs
@@ -0,0 +1,221 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        lmo
+
+[@Native name@]     Lombard, Lumbaart
+
+[@English name@]    Lombard
+-}
+module Text.Numeral.Language.LMO.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-lombard-milanese/en/lmo/
+
+Note: The test data is probably Western Lombard (lom-wes) as oposed to
+Eastern Lombard (lom-eas).
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "vun")
+      , (2, "duu")
+      , (3, "trii")
+      , (4, "quatter")
+      , (5, "cinch")
+      , (6, "ses")
+      , (7, "sett")
+      , (8, "vott")
+      , (9, "noeuv")
+      , (10, "des")
+      , (11, "vundes")
+      , (12, "dodes")
+      , (13, "tredes")
+      , (14, "quattordes")
+      , (15, "quindes")
+      , (16, "sedes")
+      , (17, "dersett")
+      , (18, "desdott")
+      , (19, "desnoeuv")
+      , (20, "vint")
+      , (21, "vintun")
+      , (22, "vintduu")
+      , (23, "vinttrii")
+      , (24, "vintquatter")
+      , (25, "vintcinch")
+      , (26, "vintses")
+      , (27, "vintsett")
+      , (28, "vintott")
+      , (29, "vintnoeuv")
+      , (30, "trenta")
+      , (31, "trentavun")
+      , (32, "trentaduu")
+      , (33, "trentatrii")
+      , (34, "trentaquatter")
+      , (35, "trentacinch")
+      , (36, "trentases")
+      , (37, "trentasett")
+      , (38, "trentott")
+      , (39, "trentanoeuv")
+      , (40, "quaranta")
+      , (41, "quarantavun")
+      , (42, "quarantaduu")
+      , (43, "quarantatrii")
+      , (44, "quarantaquatter")
+      , (45, "quarantacinch")
+      , (46, "quarantases")
+      , (47, "quarantasett")
+      , (48, "quarantott")
+      , (49, "quarantanoeuv")
+      , (50, "cinquanta")
+      , (51, "cinquantavun")
+      , (52, "cinquantaduu")
+      , (53, "cinquantatrii")
+      , (54, "cinquantaquatter")
+      , (55, "cinquantacinch")
+      , (56, "cinquantases")
+      , (57, "cinquantasett")
+      , (58, "cinquantott")
+      , (59, "cinquantanoeuv")
+      , (60, "sessanta")
+      , (61, "sessantavun")
+      , (62, "sessantaduu")
+      , (63, "sessantatrii")
+      , (64, "sessantaquatter")
+      , (65, "sessantacinch")
+      , (66, "sessantases")
+      , (67, "sessantasett")
+      , (68, "sessantott")
+      , (69, "sessantanoeuv")
+      , (70, "settanta")
+      , (71, "settantavun")
+      , (72, "settantaduu")
+      , (73, "settantatrii")
+      , (74, "settantaquatter")
+      , (75, "settantacinch")
+      , (76, "settantases")
+      , (77, "settantasett")
+      , (78, "settantott")
+      , (79, "settantanoeuv")
+      , (80, "vottanta")
+      , (81, "vottantavun")
+      , (82, "vottantaduu")
+      , (83, "vottantatrii")
+      , (84, "vottantaquatter")
+      , (85, "vottantacinch")
+      , (86, "vottantases")
+      , (87, "vottantasett")
+      , (88, "vottantott")
+      , (89, "vottantanoeuv")
+      , (90, "novanta")
+      , (91, "novantavun")
+      , (92, "novantaduu")
+      , (93, "novantatrii")
+      , (94, "novantaquatter")
+      , (95, "novantacinch")
+      , (96, "novantases")
+      , (97, "novantasett")
+      , (98, "novantott")
+      , (99, "novantanoeuv")
+      , (100, "cent")
+      , (101, "centvun")
+      , (102, "centduu")
+      , (103, "centtrii")
+      , (104, "centquatter")
+      , (105, "centcinch")
+      , (106, "centses")
+      , (107, "centsett")
+      , (108, "centvott")
+      , (109, "centnoeuv")
+      , (110, "centdes")
+      , (123, "centvinttrii")
+      , (200, "dusent")
+      , (300, "tresent")
+      , (321, "tresentvintun")
+      , (400, "quattercent")
+      , (500, "cinchcent")
+      , (600, "ses’cent")
+      , (700, "settcent")
+      , (800, "vottcent")
+      , (900, "noeuvcent")
+      , (909, "noeuvcentnoeuv")
+      , (990, "noeuvcentnovanta")
+      , (999, "noeuvcentnovantanoeuv")
+      , (1000, "mila")
+      , (1001, "mila e vun")
+      , (1008, "mila e vott")
+      , (1234, "mila e dusenttrentaquatter")
+      , (2000, "dò mila")
+      , (3000, "tré mila")
+      , (4000, "quatter mila")
+      , (4321, "quatter mila e tresentvintun")
+      , (5000, "cinch mila")
+      , (6000, "ses mila")
+      , (7000, "sett mila")
+      , (8000, "vott mila")
+      , (9000, "noeuv mila")
+      , (10000, "des mila")
+      , (12345, "dodes mila e tresentquarantacinch")
+      , (20000, "vint mila")
+      , (30000, "trenta mila")
+      , (40000, "quaranta mila")
+      , (50000, "cinquanta mila")
+      , (54321, "cinquantaquatter mila e tresentvintun")
+      , (60000, "sessanta mila")
+      , (70000, "settanta mila")
+      , (80000, "vottanta mila")
+      , (90000, "novanta mila")
+      , (100000, "centmila")
+      , (123456, "centvinttré mila e quattercentcinquantases")
+      , (200000, "dusentmila")
+      , (300000, "tresentmila")
+      , (400000, "quattercentmila")
+      , (500000, "cinchcentmila")
+      , (600000, "ses’centmila")
+      , (654321, "ses’centcinquantaquatter mila e tresentvintun")
+      , (700000, "settcentmila")
+      , (800000, "vottcentmila")
+      , (900000, "noeuvcentmila")
+      , (1000000, "on milion")
+      , (1000001, "on milion e vun")
+      , (1234567, "on milion e dusenttrentaquatter mila e cinchcentsessantasett")
+      , (2000000, "duu milion")
+      , (3000000, "trii milion")
+      , (4000000, "quatter milion")
+      , (5000000, "cinch milion")
+      , (6000000, "ses milion")
+      , (7000000, "sett milion")
+      , (7654321, "sett milion e ses’centcinquantaquatter mila e tresentvintun")
+      , (8000000, "vott milion")
+      , (9000000, "noeuv milion")
+      , (1000000000, "on miliard")
+      , (1000000001, "on miliard e vun")
+      , (2000000000, "duu miliard")
+      , (3000000000, "trii miliard")
+      , (4000000000, "quatter miliard")
+      , (5000000000, "cinch miliard")
+      , (6000000000, "ses miliard")
+      , (7000000000, "sett miliard")
+      , (8000000000, "vott miliard")
+      , (9000000000, "noeuv miliard")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/LTZ/TestData.hs b/src-test/Text/Numeral/Language/LTZ/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/LTZ/TestData.hs
@@ -0,0 +1,239 @@
+{-|
+[@ISO639-1@]        lb
+
+[@ISO639-2@]        ltz
+
+[@ISO639-3@]        ltz
+
+[@Native name@]     Lëtzebuergesch
+
+[@English name@]    Luxembourgish
+-}
+module Text.Numeral.Language.LTZ.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-luxembourgish/en/ltz/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "null")
+      , (1, "eent")
+      , (2, "zwee")
+      , (3, "dräi")
+      , (4, "véier")
+      , (5, "fënnef")
+      , (6, "sechs")
+      , (7, "siwen")
+      , (8, "aacht")
+      , (9, "néng")
+      , (10, "zéng")
+      , (11, "elef")
+      , (12, "zwielef")
+      , (13, "dräizéng")
+      , (14, "véierzéng")
+      , (15, "fofzéng")
+      , (16, "siechzéng")
+      , (17, "siwwenzéng")
+      , (18, "uechtzéng")
+      , (19, "nonzéng")
+      , (20, "zwanzeg")
+      , (21, "eenanzwanzeg")
+      , (22, "zweeanzwanzeg")
+      , (23, "dräianzwanzeg")
+      , (24, "véieranzwanzeg")
+      , (25, "fënnefanzwanzeg")
+      , (26, "sechsanzwanzeg")
+      , (27, "siwenanzwanzeg")
+      , (28, "aachtanzwanzeg")
+      , (29, "nénganzwanzeg")
+      , (30, "drësseg")
+      , (31, "eenandrësseg")
+      , (32, "zweeandrësseg")
+      , (33, "dräiandrësseg")
+      , (34, "véierandrësseg")
+      , (35, "fënnefandrësseg")
+      , (36, "sechsandrësseg")
+      , (37, "siwenandrësseg")
+      , (38, "aachtandrësseg")
+      , (39, "néngandrësseg")
+      , (40, "véierzeg")
+      , (41, "eenanvéierzeg")
+      , (42, "zweeanvéierzeg")
+      , (43, "dräianvéierzeg")
+      , (44, "véieranvéierzeg")
+      , (45, "fënnefanvéierzeg")
+      , (46, "sechsanvéierzeg")
+      , (47, "siwenanvéierzeg")
+      , (48, "aachtanvéierzeg")
+      , (49, "nénganvéierzeg")
+      , (50, "fofzeg")
+      , (51, "eenanfofzeg")
+      , (52, "zweeanfofzeg")
+      , (53, "dräianfofzeg")
+      , (54, "véieranfofzeg")
+      , (55, "fënnefanfofzeg")
+      , (56, "sechsanfofzeg")
+      , (57, "siwenanfofzeg")
+      , (58, "aachtanfofzeg")
+      , (59, "nénganfofzeg")
+      , (60, "sechzeg")
+      , (61, "eenansechzeg")
+      , (62, "zweeansechzeg")
+      , (63, "dräiansechzeg")
+      , (64, "véieransechzeg")
+      , (65, "fënnefansechzeg")
+      , (66, "sechsansechzeg")
+      , (67, "siwenansechzeg")
+      , (68, "aachtansechzeg")
+      , (69, "néngansechzeg")
+      , (70, "siwwenzeg")
+      , (71, "eenansiwwenzeg")
+      , (72, "zweeansiwwenzeg")
+      , (73, "dräiansiwwenzeg")
+      , (74, "véieransiwwenzeg")
+      , (75, "fënnefansiwwenzeg")
+      , (76, "sechsansiwwenzeg")
+      , (77, "siwenansiwwenzeg")
+      , (78, "aachtansiwwenzeg")
+      , (79, "néngansiwwenzeg")
+      , (80, "achtzeg")
+      , (81, "eenanachtzeg")
+      , (82, "zweeanachtzeg")
+      , (83, "dräianachtzeg")
+      , (84, "véieranachtzeg")
+      , (85, "fënnefanachtzeg")
+      , (86, "sechsanachtzeg")
+      , (87, "siwenanachtzeg")
+      , (88, "aachtanachtzeg")
+      , (89, "nénganachtzeg")
+      , (90, "nonzeg")
+      , (91, "eenannonzeg")
+      , (92, "zweeannonzeg")
+      , (93, "dräiannonzeg")
+      , (94, "véierannonzeg")
+      , (95, "fënnefannonzeg")
+      , (96, "sechsannonzeg")
+      , (97, "siwenannonzeg")
+      , (98, "aachtannonzeg")
+      , (99, "néngannonzeg")
+      , (100, "honnert")
+      , (101, "honnerteent")
+      , (102, "honnertzwee")
+      , (103, "honnertdräi")
+      , (104, "honnertvéier")
+      , (105, "honnertfënnef")
+      , (106, "honnertsechs")
+      , (107, "honnertsiwen")
+      , (108, "honnertaacht")
+      , (109, "honnertnéng")
+      , (110, "honnertzéng")
+      , (123, "honnertdräianzwanzeg")
+      , (200, "zweehonnert")
+      , (300, "dräihonnert")
+      , (321, "dräihonnerteenanzwanzeg")
+      , (400, "véierhonnert")
+      , (500, "fënnefhonnert")
+      , (600, "sechshonnert")
+      , (700, "siwenhonnert")
+      , (800, "aachthonnert")
+      , (900, "nénghonnert")
+      , (909, "nénghonnertnéng")
+      , (990, "nénghonnertnonzeg")
+      , (999, "nénghonnertnéngannonzeg")
+      , (1000, "dausend")
+      , (1001, "dausendeent")
+      , (1008, "dausendaacht")
+      , (1234, "dausendzweehonnertvéierandrësseg")
+      , (2000, "zweedausend")
+      , (3000, "dräidausend")
+      , (4000, "véierdausend")
+      , (4321, "véierdausenddräihonnerteenanzwanzeg")
+      , (5000, "fënnefdausend")
+      , (6000, "sechsdausend")
+      , (7000, "siwendausend")
+      , (8000, "aachtdausend")
+      , (9000, "néngdausend")
+      , (10000, "zéngdausend")
+      , (12345, "zwielefdausenddräihonnertfënnefanvéierzeg")
+      , (20000, "zwanzegdausend")
+      , (30000, "drëssegdausend")
+      , (40000, "véierzegdausend")
+      , (50000, "fofzegdausend")
+      , (54321, "véieranfofzegdausenddräihonnerteenanzwanzeg")
+      , (60000, "sechzegdausend")
+      , (70000, "siwwenzegdausend")
+      , (80000, "achtzegdausend")
+      , (90000, "nonzegdausend")
+      , (100000, "honnertdausend")
+      , (123456, "honnertdräianzwanzegdausendvéierhonnertsechsanfofzeg")
+      , (200000, "zweehonnertdausend")
+      , (300000, "dräihonnertdausend")
+      , (400000, "véierhonnertdausend")
+      , (500000, "fënnefhonnertdausend")
+      , (600000, "sechshonnertdausend")
+      , (654321, "sechshonnertvéieranfofzegdausenddräihonnerteenanzwanzeg")
+      , (700000, "siwenhonnertdausend")
+      , (800000, "aachthonnertdausend")
+      , (900000, "nénghonnertdausend")
+      , (1000000, "eng Millioun")
+      , (1000001, "eng Millioun eent")
+      , (1234567, "eng Millioun zweehonnertvéierandrëssegdausendfënnefhonnertsiwenansechzeg")
+      , (2000000, "zwou Milliounen")
+      , (3000000, "dräi Milliounen")
+      , (4000000, "véier Milliounen")
+      , (5000000, "fënnef Milliounen")
+      , (6000000, "sechs Milliounen")
+      , (7000000, "siwen Milliounen")
+      , (7654321, "siwen Milliounen sechshonnertvéieranfofzegdausenddräihonnerteenanzwanzeg")
+      , (8000000, "aacht Milliounen")
+      , (9000000, "néng Milliounen")
+      , (1000000000, "eng Milliard")
+      , (1000000001, "eng Milliard eent")
+      , (2000000000, "zwou Milliarden")
+      , (3000000000, "dräi Milliarden")
+      , (4000000000, "véier Milliarden")
+      , (5000000000, "fënnef Milliarden")
+      , (6000000000, "sechs Milliarden")
+      , (7000000000, "siwen Milliarden")
+      , (8000000000, "aacht Milliarden")
+      , (9000000000, "néng Milliarden")
+      , (1000000000000, "eng Billion")
+      , (1000000000001, "eng Billion eent")
+      , (2000000000000, "zwou Billionen")
+      , (3000000000000, "dräi Billionen")
+      , (4000000000000, "véier Billionen")
+      , (5000000000000, "fënnef Billionen")
+      , (6000000000000, "sechs Billionen")
+      , (7000000000000, "siwen Billionen")
+      , (8000000000000, "aacht Billionen")
+      , (9000000000000, "néng Billionen")
+      , (1000000000000000, "eng Billiard")
+      , (1000000000000001, "eng Billiard eent")
+      , (2000000000000000, "zwou Billiarden")
+      , (3000000000000000, "dräi Billiarden")
+      , (4000000000000000, "véier Billiarden")
+      , (5000000000000000, "fënnef Billiarden")
+      , (6000000000000000, "sechs Billiarden")
+      , (7000000000000000, "siwen Billiarden")
+      , (8000000000000000, "aacht Billiarden")
+      , (9000000000000000, "néng Billiarden")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/MG/TestData.hs b/src-test/Text/Numeral/Language/MG/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/MG/TestData.hs
+++ /dev/null
@@ -1,162 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        mg
-
-[@ISO639-2@]        mlg
-
-[@ISO639-3@]        mlg
-
-[@Native name@]     -
-
-[@English name@]    Malagasy
--}
-
-module Text.Numeral.Language.MG.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Misc ( dec )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://en.wikipedia.org/wiki/Malagasy_language
-  http://www.sf.airnet.ne.jp/~ts/language/number/malagasy.html
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "haotra")
-      , (1, "iray")
-      , (2, "roa")
-      , (3, "telo")
-      , (4, "efatra")
-      , (5, "dimy")
-      , (6, "enina")
-      , (7, "fito")
-      , (8, "valo")
-      , (9, "sivy")
-      , (10, "folo")
-      , (11, "iraika ambin'ny folo")
-      , (12, "roa ambin'ny folo")
-      , (13, "telo ambin'ny folo")
-      , (14, "efatra ambin'ny folo")
-      , (15, "dimy ambin'ny folo")
-      , (16, "enina ambin'ny folo")
-      , (17, "fito ambin'ny folo")
-      , (18, "valo ambin'ny folo")
-      , (19, "sivy ambin'ny folo")
-      , (20, "roapolo")
-      , (21, "iraika amby roapolo")
-      , (22, "roa amby roapolo")
-      , (23, "telo amby roapolo")
-      , (24, "efatra amby roapolo")
-      , (25, "dimy amby roapolo")
-      , (26, "enina amby roapolo")
-      , (27, "fito amby roapolo")
-      , (28, "valo amby roapolo")
-      , (29, "sivy amby roapolo")
-      , (30, "telopolo")
-      , (31, "iraika amby telopolo")
-      , (32, "roa amby telopolo")
-      , (33, "telo amby telopolo")
-      , (34, "efatra amby telopolo")
-      , (35, "dimy amby telopolo")
-      , (36, "enina amby telopolo")
-      , (37, "fito amby telopolo")
-      , (38, "valo amby telopolo")
-      , (39, "sivy amby telopolo")
-      , (40, "efapolo")
-      , (41, "iraika amby efapolo")
-      , (42, "roa amby efapolo")
-      , (43, "telo amby efapolo")
-      , (44, "efatra amby efapolo")
-      , (45, "dimy amby efapolo")
-      , (46, "enina amby efapolo")
-      , (47, "fito amby efapolo")
-      , (48, "valo amby efapolo")
-      , (49, "sivy amby efapolo")
-      , (50, "dimampolo")
-      , (51, "iraika amby dimampolo")
-      , (52, "roa amby dimampolo")
-      , (53, "telo amby dimampolo")
-      , (54, "efatra amby dimampolo")
-      , (55, "dimy amby dimampolo")
-      , (56, "enina amby dimampolo")
-      , (57, "fito amby dimampolo")
-      , (58, "valo amby dimampolo")
-      , (59, "sivy amby dimampolo")
-      , (60, "enimpolo")
-      , (61, "iraika amby enimpolo")
-      , (62, "roa amby enimpolo")
-      , (63, "telo amby enimpolo")
-      , (64, "efatra amby enimpolo")
-      , (65, "dimy amby enimpolo")
-      , (66, "enina amby enimpolo")
-      , (67, "fito amby enimpolo")
-      , (68, "valo amby enimpolo")
-      , (69, "sivy amby enimpolo")
-      , (70, "fitopolo")
-      , (71, "iraika amby fitopolo")
-      , (72, "roa amby fitopolo")
-      , (73, "telo amby fitopolo")
-      , (74, "efatra amby fitopolo")
-      , (75, "dimy amby fitopolo")
-      , (76, "enina amby fitopolo")
-      , (77, "fito amby fitopolo")
-      , (78, "valo amby fitopolo")
-      , (79, "sivy amby fitopolo")
-      , (80, "valopolo")
-      , (81, "iraika amby valopolo")
-      , (82, "roa amby valopolo")
-      , (83, "telo amby valopolo")
-      , (84, "efatra amby valopolo")
-      , (85, "dimy amby valopolo")
-      , (86, "enina amby valopolo")
-      , (87, "fito amby valopolo")
-      , (88, "valo amby valopolo")
-      , (89, "sivy amby valopolo")
-      , (90, "sivifolo")
-      , (91, "iraika amby sivifolo")
-      , (92, "roa amby sivifolo")
-      , (93, "telo amby sivifolo")
-      , (94, "efatra amby sivifolo")
-      , (95, "dimy amby sivifolo")
-      , (96, "enina amby sivifolo")
-      , (97, "fito amby sivifolo")
-      , (98, "valo amby sivifolo")
-      , (99, "sivy amby sivifolo")
-      , (100, "zato")
-      , (200, "roanjato")
-      , (300, "telonjato")
-      , (400, "efajato")
-      , (500, "dimanjato")
-      , (600, "eninjato")
-      , (700, "fitonjato")
-      , (800, "valonjato")
-      , (900, "sivinjato")
-      , (1000, "arivo")
-      , (dec 4, "alina")
-      , (dec 5, "hetsy")
-      , (123456, "enina amby dimampolo sy efajato sy telo arivo sy roa alina sy hetsy")
-      , (dec 6, "tapitrisa")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/MIC/TestData.hs b/src-test/Text/Numeral/Language/MIC/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/MIC/TestData.hs
@@ -0,0 +1,197 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        mic
+
+[@ISO639-3@]        mic
+
+[@Native name@]     Míkmawísimk
+
+[@English name@]    Mi'kmaq
+-}
+module Text.Numeral.Language.MIC.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-micmac/en/mic/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "ne’wt")
+      , (2, "ta’pu")
+      , (3, "si’st")
+      , (4, "ne’w")
+      , (5, "na’n")
+      , (6, "asukom")
+      , (7, "l’uiknek")
+      , (8, "ukmuljin")
+      , (9, "pesqunatek")
+      , (10, "newtiska’q")
+      , (11, "newtiska’q jel ne’wt")
+      , (12, "newtiska’q jel ta’pu")
+      , (13, "newtiska’q jel si’st")
+      , (14, "newtiska’q jel ne’w")
+      , (15, "newtiska’q jel na’n")
+      , (16, "newtiska’q jel asukom")
+      , (17, "newtiska’q jel l’uiknek")
+      , (18, "newtiska’q jel ukmuljin")
+      , (19, "newtiska’q jel pesqunatek")
+      , (20, "tapuiska’q")
+      , (21, "tapuiska’q jel ne’wt")
+      , (22, "tapuiska’q jel ta’pu")
+      , (23, "tapuiska’q jel si’st")
+      , (24, "tapuiska’q jel ne’w")
+      , (25, "tapuiska’q jel na’n")
+      , (26, "tapuiska’q jel asukom")
+      , (27, "tapuiska’q jel l’uiknek")
+      , (28, "tapuiska’q jel ukmuljin")
+      , (29, "tapuiska’q jel pesqunatek")
+      , (30, "nesiska’q")
+      , (31, "nesiska’q jel ne’wt")
+      , (32, "nesiska’q jel ta’pu")
+      , (33, "nesiska’q jel si’st")
+      , (34, "nesiska’q jel ne’w")
+      , (35, "nesiska’q jel na’n")
+      , (36, "nesiska’q jel asukom")
+      , (37, "nesiska’q jel l’uiknek")
+      , (38, "nesiska’q jel ukmuljin")
+      , (39, "nesiska’q jel pesqunatek")
+      , (40, "newiska’q")
+      , (41, "newiska’q jel ne’wt")
+      , (42, "newiska’q jel ta’pu")
+      , (43, "newiska’q jel si’st")
+      , (44, "newiska’q jel ne’w")
+      , (45, "newiska’q jel na’n")
+      , (46, "newiska’q jel asukom")
+      , (47, "newiska’q jel l’uiknek")
+      , (48, "newiska’q jel ukmuljin")
+      , (49, "newiska’q jel pesqunatek")
+      , (50, "naniska’q")
+      , (51, "naniska’q jel ne’wt")
+      , (52, "naniska’q jel ta’pu")
+      , (53, "naniska’q jel si’st")
+      , (54, "naniska’q jel ne’w")
+      , (55, "naniska’q jel na’n")
+      , (56, "naniska’q jel asukom")
+      , (57, "naniska’q jel l’uiknek")
+      , (58, "naniska’q jel ukmuljin")
+      , (59, "naniska’q jel pesqunatek")
+      , (60, "asukom te’siska’q")
+      , (61, "asukom te’siska’q jel ne’wt")
+      , (62, "asukom te’siska’q jel ta’pu")
+      , (63, "asukom te’siska’q jel si’st")
+      , (64, "asukom te’siska’q jel ne’w")
+      , (65, "asukom te’siska’q jel na’n")
+      , (66, "asukom te’siska’q jel asukom")
+      , (67, "asukom te’siska’q jel l’uiknek")
+      , (68, "asukom te’siska’q jel ukmuljin")
+      , (69, "asukom te’siska’q jel pesqunatek")
+      , (70, "l’uiknek te’siska’q")
+      , (71, "l’uiknek te’siska’q jel ne’wt")
+      , (72, "l’uiknek te’siska’q jel ta’pu")
+      , (73, "l’uiknek te’siska’q jel si’st")
+      , (74, "l’uiknek te’siska’q jel ne’w")
+      , (75, "l’uiknek te’siska’q jel na’n")
+      , (76, "l’uiknek te’siska’q jel asukom")
+      , (77, "l’uiknek te’siska’q jel l’uiknek")
+      , (78, "l’uiknek te’siska’q jel ukmuljin")
+      , (79, "l’uiknek te’siska’q jel pesqunatek")
+      , (80, "ukmuljin te’siska’q")
+      , (81, "ukmuljin te’siska’q jel ne’wt")
+      , (82, "ukmuljin te’siska’q jel ta’pu")
+      , (83, "ukmuljin te’siska’q jel si’st")
+      , (84, "ukmuljin te’siska’q jel ne’w")
+      , (85, "ukmuljin te’siska’q jel na’n")
+      , (86, "ukmuljin te’siska’q jel asukom")
+      , (87, "ukmuljin te’siska’q jel l’uiknek")
+      , (88, "ukmuljin te’siska’q jel ukmuljin")
+      , (89, "ukmuljin te’siska’q jel pesqunatek")
+      , (90, "pesqunatek te’siska’q")
+      , (91, "pesqunatek te’siska’q jel ne’wt")
+      , (92, "pesqunatek te’siska’q jel ta’pu")
+      , (93, "pesqunatek te’siska’q jel si’st")
+      , (94, "pesqunatek te’siska’q jel ne’w")
+      , (95, "pesqunatek te’siska’q jel na’n")
+      , (96, "pesqunatek te’siska’q jel asukom")
+      , (97, "pesqunatek te’siska’q jel l’uiknek")
+      , (98, "pesqunatek te’siska’q jel ukmuljin")
+      , (99, "pesqunatek te’siska’q jel pesqunatek")
+      , (100, "kaskimtlnaqn")
+      , (101, "kaskimtlnaqn te’siska’q jel ne’wt")
+      , (102, "kaskimtlnaqn te’siska’q jel ta’pu")
+      , (103, "kaskimtlnaqn te’siska’q jel si’st")
+      , (104, "kaskimtlnaqn te’siska’q jel ne’w")
+      , (105, "kaskimtlnaqn te’siska’q jel na’n")
+      , (106, "kaskimtlnaqn te’siska’q jel asukom")
+      , (107, "kaskimtlnaqn te’siska’q jel l’uiknek")
+      , (108, "kaskimtlnaqn te’siska’q jel ukmuljin")
+      , (109, "kaskimtlnaqn te’siska’q jel pesqunatek")
+      , (110, "kaskimtlnaqn te’siska’q jel newtiska’q")
+      , (123, "kaskimtlnaqn te’siska’q jel tapuiska’q jel si’st")
+      , (200, "ta’pu kaskimtlnaqn")
+      , (300, "si’st kaskimtlnaqn")
+      , (321, "si’st kaskimtlnaqn te’siska’q jel tapuiska’q jel ne’wt")
+      , (400, "ne’w kaskimtlnaqn")
+      , (500, "na’n kaskimtlnaqn")
+      , (600, "asukom kaskimtlnaqn")
+      , (700, "l’uiknek kaskimtlnaqn")
+      , (800, "ukmuljin kaskimtlnaqn")
+      , (900, "pesqunatek kaskimtlnaqn")
+      , (909, "pesqunatek kaskimtlnaqn te’siska’q jel pesqunatek")
+      , (990, "pesqunatek kaskimtlnaqn te’siska’q jel pesqunatek te’siska’q")
+      , (999, "pesqunatek kaskimtlnaqn te’siska’q jel pesqunatek te’siska’q jel pesqunatek")
+      , (1000, "pituimtlnaqn")
+      , (1001, "pituimtlnaqn te’siska’q jel ne’wt")
+      , (1008, "pituimtlnaqn te’siska’q jel ukmuljin")
+      , (1234, "pituimtlnaqn te’siska’q jel ta’pu kaskimtlnaqn te’siska’q jel nesiska’q jel ne’w")
+      , (2000, "ta’pu pituimtlnaqn")
+      , (3000, "si’st pituimtlnaqn")
+      , (4000, "ne’w pituimtlnaqn")
+      , (4321, "ne’w pituimtlnaqn te’siska’q jel si’st kaskimtlnaqn te’siska’q jel tapuiska’q jel ne’wt")
+      , (5000, "na’n pituimtlnaqn")
+      , (6000, "asukom pituimtlnaqn")
+      , (7000, "l’uiknek pituimtlnaqn")
+      , (8000, "ukmuljin pituimtlnaqn")
+      , (9000, "pesqunatek pituimtlnaqn")
+      , (10000, "pituimtlnaqnepikatun")
+      , (12345, "newtiska’q jel ta’pu pituimtlnaqn te’siska’q jel si’st kaskimtlnaqn te’siska’q jel newiska’q jel na’n")
+      , (20000, "tapuiska’q pituimtlnaqn")
+      , (30000, "nesiska’q pituimtlnaqn")
+      , (40000, "newiska’q pituimtlnaqn")
+      , (50000, "naniska’q pituimtlnaqn")
+      , (54321, "naniska’q jel ne’w pituimtlnaqn te’siska’q jel si’st kaskimtlnaqn te’siska’q jel tapuiska’q jel ne’wt")
+      , (60000, "asukom te’siska’q pituimtlnaqn")
+      , (70000, "l’uiknek te’siska’q pituimtlnaqn")
+      , (80000, "ukmuljin te’siska’q pituimtlnaqn")
+      , (90000, "pesqunatek te’siska’q pituimtlnaqn")
+      , (100000, "kaskimtlnaqn pituimtlnaqn")
+      , (123456, "kaskimtlnaqn te’siska’q jel tapuiska’q jel si’st pituimtlnaqn te’siska’q jel ne’w kaskimtlnaqn te’siska’q jel naniska’q jel asukom")
+      , (200000, "ta’pu kaskimtlnaqn pituimtlnaqn")
+      , (300000, "si’st kaskimtlnaqn pituimtlnaqn")
+      , (400000, "ne’w kaskimtlnaqn pituimtlnaqn")
+      , (500000, "na’n kaskimtlnaqn pituimtlnaqn")
+      , (600000, "asukom kaskimtlnaqn pituimtlnaqn")
+      , (654321, "asukom kaskimtlnaqn te’siska’q jel naniska’q jel ne’w pituimtlnaqn te’siska’q jel si’st kaskimtlnaqn te’siska’q jel tapuiska’q jel ne’wt")
+      , (700000, "l’uiknek kaskimtlnaqn pituimtlnaqn")
+      , (800000, "ukmuljin kaskimtlnaqn pituimtlnaqn")
+      , (900000, "pesqunatek kaskimtlnaqn pituimtlnaqn")
+      , (1000000, "kji-pituimtlnaqn")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/MIN/TestData.hs b/src-test/Text/Numeral/Language/MIN/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/MIN/TestData.hs
@@ -0,0 +1,138 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        min
+
+[@ISO639-3@]        min
+
+[@Native name@]     Baso Minangkabau, باسو مينڠكاباو
+
+[@English name@]    Minangkabau
+-}
+module Text.Numeral.Language.MIN.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-minangkabau/en/min/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "ciek")
+      , (2, "duo")
+      , (3, "tigo")
+      , (4, "ampek")
+      , (5, "limo")
+      , (6, "anam")
+      , (7, "tujuah")
+      , (8, "salapan")
+      , (9, "sambilan")
+      , (10, "sapuluah")
+      , (11, "sabaleh")
+      , (12, "duo baleh")
+      , (13, "tigo baleh")
+      , (14, "ampek baleh")
+      , (15, "limo baleh")
+      , (16, "anam baleh")
+      , (17, "tujuah baleh")
+      , (18, "salapan baleh")
+      , (19, "sambilan baleh")
+      , (20, "duo puluah")
+      , (21, "duo puluah ciek")
+      , (22, "duo puluah duo")
+      , (23, "duo puluah tigo")
+      , (24, "duo puluah ampek")
+      , (25, "duo puluah limo")
+      , (26, "duo puluah anam")
+      , (27, "duo puluah tujuah")
+      , (28, "duo puluah salapan")
+      , (29, "duo puluah sambilan")
+      , (30, "tigo puluah")
+      , (31, "tigo puluah ciek")
+      , (32, "tigo puluah duo")
+      , (33, "tigo puluah tigo")
+      , (34, "tigo puluah ampek")
+      , (35, "tigo puluah limo")
+      , (36, "tigo puluah anam")
+      , (37, "tigo puluah tujuah")
+      , (38, "tigo puluah salapan")
+      , (39, "tigo puluah sambilan")
+      , (40, "ampek puluah")
+      , (41, "ampek puluah ciek")
+      , (42, "ampek puluah duo")
+      , (43, "ampek puluah tigo")
+      , (44, "ampek puluah ampek")
+      , (45, "ampek puluah limo")
+      , (46, "ampek puluah anam")
+      , (47, "ampek puluah tujuah")
+      , (48, "ampek puluah salapan")
+      , (49, "ampek puluah sambilan")
+      , (50, "limo puluah")
+      , (51, "limo puluah ciek")
+      , (52, "limo puluah duo")
+      , (53, "limo puluah tigo")
+      , (54, "limo puluah ampek")
+      , (55, "limo puluah limo")
+      , (56, "limo puluah anam")
+      , (57, "limo puluah tujuah")
+      , (58, "limo puluah salapan")
+      , (59, "limo puluah sambilan")
+      , (60, "anam puluah")
+      , (61, "anam puluah ciek")
+      , (62, "anam puluah duo")
+      , (63, "anam puluah tigo")
+      , (64, "anam puluah ampek")
+      , (65, "anam puluah limo")
+      , (66, "anam puluah anam")
+      , (67, "anam puluah tujuah")
+      , (68, "anam puluah salapan")
+      , (69, "anam puluah sambilan")
+      , (70, "tujuah puluah")
+      , (71, "tujuah puluah ciek")
+      , (72, "tujuah puluah duo")
+      , (73, "tujuah puluah tigo")
+      , (74, "tujuah puluah ampek")
+      , (75, "tujuah puluah limo")
+      , (76, "tujuah puluah anam")
+      , (77, "tujuah puluah tujuah")
+      , (78, "tujuah puluah salapan")
+      , (79, "tujuah puluah sambilan")
+      , (80, "salapan puluah")
+      , (81, "salapan puluah ciek")
+      , (82, "salapan puluah duo")
+      , (83, "salapan puluah tigo")
+      , (84, "salapan puluah ampek")
+      , (85, "salapan puluah limo")
+      , (86, "salapan puluah anam")
+      , (87, "salapan puluah tujuah")
+      , (88, "salapan puluah salapan")
+      , (89, "salapan puluah sambilan")
+      , (90, "sambilan puluah")
+      , (91, "sambilan puluah ciek")
+      , (92, "sambilan puluah duo")
+      , (93, "sambilan puluah tigo")
+      , (94, "sambilan puluah ampek")
+      , (95, "sambilan puluah limo")
+      , (96, "sambilan puluah anam")
+      , (97, "sambilan puluah tujuah")
+      , (98, "sambilan puluah salapan")
+      , (99, "sambilan puluah sambilan")
+      , (100, "saratuih")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/MLG/TestData.hs b/src-test/Text/Numeral/Language/MLG/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/MLG/TestData.hs
@@ -0,0 +1,155 @@
+{-|
+[@ISO639-1@]        mg
+
+[@ISO639-2@]        mlg
+
+[@ISO639-3@]        mlg
+
+[@Native name@]     -
+
+[@English name@]    Malagasy
+-}
+
+module Text.Numeral.Language.MLG.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Misc ( dec )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://en.wikipedia.org/wiki/Malagasy_language
+  http://www.sf.airnet.ne.jp/~ts/language/number/malagasy.html
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "haotra")
+      , (1, "iray")
+      , (2, "roa")
+      , (3, "telo")
+      , (4, "efatra")
+      , (5, "dimy")
+      , (6, "enina")
+      , (7, "fito")
+      , (8, "valo")
+      , (9, "sivy")
+      , (10, "folo")
+      , (11, "iraika ambin'ny folo")
+      , (12, "roa ambin'ny folo")
+      , (13, "telo ambin'ny folo")
+      , (14, "efatra ambin'ny folo")
+      , (15, "dimy ambin'ny folo")
+      , (16, "enina ambin'ny folo")
+      , (17, "fito ambin'ny folo")
+      , (18, "valo ambin'ny folo")
+      , (19, "sivy ambin'ny folo")
+      , (20, "roapolo")
+      , (21, "iraika amby roapolo")
+      , (22, "roa amby roapolo")
+      , (23, "telo amby roapolo")
+      , (24, "efatra amby roapolo")
+      , (25, "dimy amby roapolo")
+      , (26, "enina amby roapolo")
+      , (27, "fito amby roapolo")
+      , (28, "valo amby roapolo")
+      , (29, "sivy amby roapolo")
+      , (30, "telopolo")
+      , (31, "iraika amby telopolo")
+      , (32, "roa amby telopolo")
+      , (33, "telo amby telopolo")
+      , (34, "efatra amby telopolo")
+      , (35, "dimy amby telopolo")
+      , (36, "enina amby telopolo")
+      , (37, "fito amby telopolo")
+      , (38, "valo amby telopolo")
+      , (39, "sivy amby telopolo")
+      , (40, "efapolo")
+      , (41, "iraika amby efapolo")
+      , (42, "roa amby efapolo")
+      , (43, "telo amby efapolo")
+      , (44, "efatra amby efapolo")
+      , (45, "dimy amby efapolo")
+      , (46, "enina amby efapolo")
+      , (47, "fito amby efapolo")
+      , (48, "valo amby efapolo")
+      , (49, "sivy amby efapolo")
+      , (50, "dimampolo")
+      , (51, "iraika amby dimampolo")
+      , (52, "roa amby dimampolo")
+      , (53, "telo amby dimampolo")
+      , (54, "efatra amby dimampolo")
+      , (55, "dimy amby dimampolo")
+      , (56, "enina amby dimampolo")
+      , (57, "fito amby dimampolo")
+      , (58, "valo amby dimampolo")
+      , (59, "sivy amby dimampolo")
+      , (60, "enimpolo")
+      , (61, "iraika amby enimpolo")
+      , (62, "roa amby enimpolo")
+      , (63, "telo amby enimpolo")
+      , (64, "efatra amby enimpolo")
+      , (65, "dimy amby enimpolo")
+      , (66, "enina amby enimpolo")
+      , (67, "fito amby enimpolo")
+      , (68, "valo amby enimpolo")
+      , (69, "sivy amby enimpolo")
+      , (70, "fitopolo")
+      , (71, "iraika amby fitopolo")
+      , (72, "roa amby fitopolo")
+      , (73, "telo amby fitopolo")
+      , (74, "efatra amby fitopolo")
+      , (75, "dimy amby fitopolo")
+      , (76, "enina amby fitopolo")
+      , (77, "fito amby fitopolo")
+      , (78, "valo amby fitopolo")
+      , (79, "sivy amby fitopolo")
+      , (80, "valopolo")
+      , (81, "iraika amby valopolo")
+      , (82, "roa amby valopolo")
+      , (83, "telo amby valopolo")
+      , (84, "efatra amby valopolo")
+      , (85, "dimy amby valopolo")
+      , (86, "enina amby valopolo")
+      , (87, "fito amby valopolo")
+      , (88, "valo amby valopolo")
+      , (89, "sivy amby valopolo")
+      , (90, "sivifolo")
+      , (91, "iraika amby sivifolo")
+      , (92, "roa amby sivifolo")
+      , (93, "telo amby sivifolo")
+      , (94, "efatra amby sivifolo")
+      , (95, "dimy amby sivifolo")
+      , (96, "enina amby sivifolo")
+      , (97, "fito amby sivifolo")
+      , (98, "valo amby sivifolo")
+      , (99, "sivy amby sivifolo")
+      , (100, "zato")
+      , (200, "roanjato")
+      , (300, "telonjato")
+      , (400, "efajato")
+      , (500, "dimanjato")
+      , (600, "eninjato")
+      , (700, "fitonjato")
+      , (800, "valonjato")
+      , (900, "sivinjato")
+      , (1000, "arivo")
+      , (dec 4, "alina")
+      , (dec 5, "hetsy")
+      , (123456, "enina amby dimampolo sy efajato sy telo arivo sy roa alina sy hetsy")
+      , (dec 6, "tapitrisa")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/MNK/TestData.hs b/src-test/Text/Numeral/Language/MNK/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/MNK/TestData.hs
@@ -0,0 +1,174 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        mnk
+
+[@Native name@]     Mandingo, لغة مندنكا
+
+[@English name@]    Mandinka
+-}
+module Text.Numeral.Language.MNK.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-mandinka/en/mnk/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "kiliŋ")
+      , (2, "fula")
+      , (3, "saba")
+      , (4, "naani")
+      , (5, "luulu")
+      , (6, "wooro")
+      , (7, "worowula")
+      , (8, "sey")
+      , (9, "kononto")
+      , (10, "taŋ")
+      , (11, "taŋ niŋ kiliŋ")
+      , (12, "taŋ niŋ fula")
+      , (13, "taŋ niŋ saba")
+      , (14, "taŋ niŋ naani")
+      , (15, "taŋ niŋ luulu")
+      , (16, "taŋ niŋ wooro")
+      , (17, "taŋ niŋ worowula")
+      , (18, "taŋ niŋ sey")
+      , (19, "taŋ niŋ kononto")
+      , (20, "muwaŋ")
+      , (21, "muwaŋ niŋ kiliŋ")
+      , (22, "muwaŋ niŋ fula")
+      , (23, "muwaŋ niŋ saba")
+      , (24, "muwaŋ niŋ naani")
+      , (25, "muwaŋ niŋ luulu")
+      , (26, "muwaŋ niŋ wooro")
+      , (27, "muwaŋ niŋ worowula")
+      , (28, "muwaŋ niŋ sey")
+      , (29, "muwaŋ niŋ kononto")
+      , (30, "taŋ saba")
+      , (31, "taŋ saba niŋ kiliŋ")
+      , (32, "taŋ saba niŋ fula")
+      , (33, "taŋ saba niŋ saba")
+      , (34, "taŋ saba niŋ naani")
+      , (35, "taŋ saba niŋ luulu")
+      , (36, "taŋ saba niŋ wooro")
+      , (37, "taŋ saba niŋ worowula")
+      , (38, "taŋ saba niŋ sey")
+      , (39, "taŋ saba niŋ kononto")
+      , (40, "taŋ naani")
+      , (41, "taŋ naani niŋ kiliŋ")
+      , (42, "taŋ naani niŋ fula")
+      , (43, "taŋ naani niŋ saba")
+      , (44, "taŋ naani niŋ naani")
+      , (45, "taŋ naani niŋ luulu")
+      , (46, "taŋ naani niŋ wooro")
+      , (47, "taŋ naani niŋ worowula")
+      , (48, "taŋ naani niŋ sey")
+      , (49, "taŋ naani niŋ kononto")
+      , (50, "taŋ luulu")
+      , (51, "taŋ luulu niŋ kiliŋ")
+      , (52, "taŋ luulu niŋ fula")
+      , (53, "taŋ luulu niŋ saba")
+      , (54, "taŋ luulu niŋ naani")
+      , (55, "taŋ luulu niŋ luulu")
+      , (56, "taŋ luulu niŋ wooro")
+      , (57, "taŋ luulu niŋ worowula")
+      , (58, "taŋ luulu niŋ sey")
+      , (59, "taŋ luulu niŋ kononto")
+      , (60, "taŋ wooro")
+      , (61, "taŋ wooro niŋ kiliŋ")
+      , (62, "taŋ wooro niŋ fula")
+      , (63, "taŋ wooro niŋ saba")
+      , (64, "taŋ wooro niŋ naani")
+      , (65, "taŋ wooro niŋ luulu")
+      , (66, "taŋ wooro niŋ wooro")
+      , (67, "taŋ wooro niŋ worowula")
+      , (68, "taŋ wooro niŋ sey")
+      , (69, "taŋ wooro niŋ kononto")
+      , (70, "taŋ worowula")
+      , (71, "taŋ worowula niŋ kiliŋ")
+      , (72, "taŋ worowula niŋ fula")
+      , (73, "taŋ worowula niŋ saba")
+      , (74, "taŋ worowula niŋ naani")
+      , (75, "taŋ worowula niŋ luulu")
+      , (76, "taŋ worowula niŋ wooro")
+      , (77, "taŋ worowula niŋ worowula")
+      , (78, "taŋ worowula niŋ sey")
+      , (79, "taŋ worowula niŋ kononto")
+      , (80, "taŋ sey")
+      , (81, "taŋ sey niŋ kiliŋ")
+      , (82, "taŋ sey niŋ fula")
+      , (83, "taŋ sey niŋ saba")
+      , (84, "taŋ sey niŋ naani")
+      , (85, "taŋ sey niŋ luulu")
+      , (86, "taŋ sey niŋ wooro")
+      , (87, "taŋ sey niŋ worowula")
+      , (88, "taŋ sey niŋ sey")
+      , (89, "taŋ sey niŋ kononto")
+      , (90, "taŋ konoto")
+      , (91, "taŋ konoto niŋ kiliŋ")
+      , (92, "taŋ konoto niŋ fula")
+      , (93, "taŋ konoto niŋ saba")
+      , (94, "taŋ konoto niŋ naani")
+      , (95, "taŋ konoto niŋ luulu")
+      , (96, "taŋ konoto niŋ wooro")
+      , (97, "taŋ konoto niŋ worowula")
+      , (98, "taŋ konoto niŋ sey")
+      , (99, "taŋ konoto niŋ kononto")
+      , (100, "keme kiliŋ")
+      , (101, "keme kiliŋ niŋ kiliŋ")
+      , (102, "keme kiliŋ niŋ fula")
+      , (103, "keme kiliŋ niŋ saba")
+      , (104, "keme kiliŋ niŋ naani")
+      , (105, "keme kiliŋ niŋ luulu")
+      , (106, "keme kiliŋ niŋ wooro")
+      , (107, "keme kiliŋ niŋ worowula")
+      , (108, "keme kiliŋ niŋ sey")
+      , (109, "keme kiliŋ niŋ kononto")
+      , (110, "keme kiliŋ niŋ taŋ")
+      , (123, "keme kiliŋ niŋ muwaŋ niŋ saba")
+      , (200, "keme fula")
+      , (300, "keme saba")
+      , (321, "keme saba niŋ muwaŋ niŋ kiliŋ")
+      , (400, "keme naani")
+      , (500, "keme luulu")
+      , (600, "keme wooro")
+      , (700, "keme worowula")
+      , (800, "keme sey")
+      , (900, "keme kononto")
+      , (909, "keme kononto niŋ kononto")
+      , (990, "keme kononto niŋ taŋ konoto")
+      , (999, "keme kononto niŋ taŋ konoto niŋ kononto")
+      , (1000, "wuli kiliŋ")
+      , (1001, "wuli kiliŋ niŋ kiliŋ")
+      , (1008, "wuli kiliŋ niŋ sey")
+      , (1234, "wuli kiliŋ niŋ keme fula niŋ taŋ saba niŋ naani")
+      , (2000, "wuli fula")
+      , (3000, "wuli saba")
+      , (4000, "wuli naani")
+      , (4321, "wuli naani niŋ keme saba niŋ muwaŋ niŋ kiliŋ")
+      , (5000, "wuli luulu")
+      , (6000, "wuli wooro")
+      , (7000, "wuli worowula")
+      , (8000, "wuli sey")
+      , (9000, "wuli kononto")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/MOH/TestData.hs b/src-test/Text/Numeral/Language/MOH/TestData.hs
--- a/src-test/Text/Numeral/Language/MOH/TestData.hs
+++ b/src-test/Text/Numeral/Language/MOH/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-acholi/en/moh
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/NAV/TestData.hs b/src-test/Text/Numeral/Language/NAV/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/NAV/TestData.hs
@@ -0,0 +1,208 @@
+{-|
+[@ISO639-1@]        nv
+
+[@ISO639-2@]        nav
+
+[@ISO639-3@]        nav
+
+[@Native name@]     Diné bizaad
+
+[@English name@]    Navajo
+-}
+module Text.Numeral.Language.NAV.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-navajo/en/nav/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "tʼááłáʼí")
+      , (2, "naaki")
+      , (3, "tááʼ")
+      , (4, "dį́į́ʼ")
+      , (5, "ashdlaʼ")
+      , (6, "hastą́ą́")
+      , (7, "tsostsʼid")
+      , (8, "tseebíí")
+      , (9, "náhástʼéí")
+      , (10, "neeznáá")
+      , (11, "łáʼtsʼáadah")
+      , (12, "naakitsʼáadah")
+      , (13, "táátsʼáadah")
+      , (14, "dį́į́ʼtsʼáadah")
+      , (15, "ashdlaʼáadah")
+      , (16, "hastą́ʼáadah")
+      , (17, "tsostsʼidtsʼáadah")
+      , (18, "tseebíítsʼáadah")
+      , (19, "náhástʼéítsʼáadah")
+      , (20, "naadiin")
+      , (21, "naadįįłaʼ")
+      , (22, "naadįįnaaki")
+      , (23, "naadįįtááʼ")
+      , (24, "naadįįdį́į́ʼ")
+      , (25, "naadįįʼashdlaʼ")
+      , (26, "naadįįhastą́ą́")
+      , (27, "naadįįtsostsʼid")
+      , (28, "naadįįtseebíí")
+      , (29, "naadįįnáhástʼéí")
+      , (30, "tádiin")
+      , (31, "tádiin dóó baʼąą tʼááłáʼí")
+      , (32, "tádiin dóó baʼąą naaki")
+      , (33, "tádiin dóó baʼąą tááʼ")
+      , (34, "tádiin dóó baʼąą dį́į́ʼ")
+      , (35, "tádiin dóó baʼąą ashdlaʼ")
+      , (36, "tádiin dóó baʼąą hastą́ą́")
+      , (37, "tádiin dóó baʼąą tsostsʼid")
+      , (38, "tádiin dóó baʼąą tseebíí")
+      , (39, "tádiin dóó baʼąą náhástʼéí")
+      , (40, "dízdiin")
+      , (41, "dízdįįłaʼ")
+      , (42, "dízdįįnaaki")
+      , (43, "dízdįįtááʼ")
+      , (44, "dízdįįdį́į́ʼ")
+      , (45, "dízdįįʼashdlaʼ")
+      , (46, "dízdįįhastą́ą́")
+      , (47, "dízdįįtsostsʼid")
+      , (48, "dízdįįtseebíí")
+      , (49, "dízdįįnáhástʼéí")
+      , (50, "ashdladiin")
+      , (51, "ashdladiin dóó baʼąą tʼááłáʼí")
+      , (52, "ashdladiin dóó baʼąą naaki")
+      , (53, "ashdladiin dóó baʼąą tááʼ")
+      , (54, "ashdladiin dóó baʼąą dį́į́ʼ")
+      , (55, "ashdladiin dóó baʼąą ashdlaʼ")
+      , (56, "ashdladiin dóó baʼąą hastą́ą́")
+      , (57, "ashdladiin dóó baʼąą tsostsʼid")
+      , (58, "ashdladiin dóó baʼąą tseebíí")
+      , (59, "ashdladiin dóó baʼąą náhástʼéí")
+      , (60, "hastą́diin")
+      , (61, "hastą́diin dóó baʼąą tʼááłáʼí")
+      , (62, "hastą́diin dóó baʼąą naaki")
+      , (63, "hastą́diin dóó baʼąą tááʼ")
+      , (64, "hastą́diin dóó baʼąą dį́į́ʼ")
+      , (65, "hastą́diin dóó baʼąą ashdlaʼ")
+      , (66, "hastą́diin dóó baʼąą hastą́ą́")
+      , (67, "hastą́diin dóó baʼąą tsostsʼid")
+      , (68, "hastą́diin dóó baʼąą tseebíí")
+      , (69, "hastą́diin dóó baʼąą náhástʼéí")
+      , (70, "tsostsʼidiin")
+      , (71, "tsostsʼidiin dóó baʼąą tʼááłáʼí")
+      , (72, "tsostsʼidiin dóó baʼąą naaki")
+      , (73, "tsostsʼidiin dóó baʼąą tááʼ")
+      , (74, "tsostsʼidiin dóó baʼąą dį́į́ʼ")
+      , (75, "tsostsʼidiin dóó baʼąą ashdlaʼ")
+      , (76, "tsostsʼidiin dóó baʼąą hastą́ą́")
+      , (77, "tsostsʼidiin dóó baʼąą tsostsʼid")
+      , (78, "tsostsʼidiin dóó baʼąą tseebíí")
+      , (79, "tsostsʼidiin dóó baʼąą náhástʼéí")
+      , (80, "tseebídiin")
+      , (81, "tseebídiin dóó baʼąą tʼááłáʼí")
+      , (82, "tseebídiin dóó baʼąą naaki")
+      , (83, "tseebídiin dóó baʼąą tááʼ")
+      , (84, "tseebídiin dóó baʼąą dį́į́ʼ")
+      , (85, "tseebídiin dóó baʼąą ashdlaʼ")
+      , (86, "tseebídiin dóó baʼąą hastą́ą́")
+      , (87, "tseebídiin dóó baʼąą tsostsʼid")
+      , (88, "tseebídiin dóó baʼąą tseebíí")
+      , (89, "tseebídiin dóó baʼąą náhástʼéí")
+      , (90, "náhástʼédiin")
+      , (91, "náhástʼédiin dóó baʼąą tʼááłáʼí")
+      , (92, "náhástʼédiin dóó baʼąą naaki")
+      , (93, "náhástʼédiin dóó baʼąą tááʼ")
+      , (94, "náhástʼédiin dóó baʼąą dį́į́ʼ")
+      , (95, "náhástʼédiin dóó baʼąą ashdlaʼ")
+      , (96, "náhástʼédiin dóó baʼąą hastą́ą́")
+      , (97, "náhástʼédiin dóó baʼąą tsostsʼid")
+      , (98, "náhástʼédiin dóó baʼąą tseebíí")
+      , (99, "náhástʼédiin dóó baʼąą náhástʼéí")
+      , (100, "tʼááłáhádí neeznádiin")
+      , (101, "tʼááłáhádí neeznádiin tʼááłáʼí")
+      , (102, "tʼááłáhádí neeznádiin naaki")
+      , (103, "tʼááłáhádí neeznádiin tááʼ")
+      , (104, "tʼááłáhádí neeznádiin dį́į́ʼ")
+      , (105, "tʼááłáhádí neeznádiin ashdlaʼ")
+      , (106, "tʼááłáhádí neeznádiin hastą́ą́")
+      , (107, "tʼááłáhádí neeznádiin tsostsʼid")
+      , (108, "tʼááłáhádí neeznádiin tseebíí")
+      , (109, "tʼááłáhádí neeznádiin náhástʼéí")
+      , (110, "tʼááłáhádí neeznádiin neeznáá")
+      , (123, "tʼááłáhádí neeznádiin naadįįtááʼ")
+      , (200, "naakidi neeznádiin")
+      , (300, "táadi neeznádiin")
+      , (321, "táadi neeznádiin naadįįłaʼ")
+      , (400, "dį́įʼdi neeznádiin")
+      , (500, "ashdladi neeznádiin")
+      , (600, "hastą́ądi neeznádiin")
+      , (700, "tsostsʼidi neeznádiin")
+      , (800, "tseebíidi neeznádiin")
+      , (900, "náhástʼéidi neeznádiin")
+      , (909, "náhástʼéidi neeznádiin náhástʼéí")
+      , (990, "náhástʼéidi neeznádiin náhástʼédiin")
+      , (999, "náhástʼéidi neeznádiin náhástʼédiin dóó baʼąą náhástʼéí")
+      , (1000, "tʼááłáhádí mííl")
+      , (1001, "tʼááłáhádí mííl tʼááłáʼí")
+      , (1008, "tʼááłáhádí mííl tseebíí")
+      , (1234, "tʼááłáhádí mííl naakidi neeznádiin tádiin dóó baʼąą dį́į́ʼ")
+      , (2000, "naakidi mííl")
+      , (3000, "táadi mííl")
+      , (4000, "dį́įʼdi mííl")
+      , (4321, "dį́įʼdi mííl táadi neeznádiin naadįįłaʼ")
+      , (5000, "ashdladi mííl")
+      , (6000, "hastą́ądi mííl")
+      , (7000, "tsostsʼidi mííl")
+      , (8000, "tseebíidi mííl")
+      , (9000, "náhástʼéidi mííl")
+      , (10000, "neeznáá mííl")
+      , (12345, "naakitsʼáadah mííl táadi neeznádiin dízdįįʼashdlaʼ")
+      , (20000, "naadiin mííl")
+      , (30000, "tádiin mííl")
+      , (40000, "dízdiin mííl")
+      , (50000, "ashdladiin mííl")
+      , (54321, "ashdladiin dóó baʼąą dį́įʼdi mííl táadi neeznádiin naadįįłaʼ")
+      , (60000, "hastą́diin mííl")
+      , (70000, "tsostsʼidiin mííl")
+      , (80000, "tseebídiin mííl")
+      , (90000, "náhástʼédiin mííl")
+      , (100000, "tʼááłáhádí neeznádiin mííl")
+      , (123456, "tʼááłáhádí neeznádiin naadįįtáadi mííl dį́įʼdi neeznádiin ashdladiin dóó baʼąą hastą́ą́")
+      , (200000, "naakidi neeznádiin mííl")
+      , (300000, "táadi neeznádiin mííl")
+      , (400000, "dį́įʼdi neeznádiin mííl")
+      , (500000, "ashdladi neeznádiin mííl")
+      , (600000, "hastą́ądi neeznádiin mííl")
+      , (654321, "hastą́ądi neeznádiin ashdladiin dóó baʼąą dį́įʼdi mííl táadi neeznádiin naadįįłaʼ")
+      , (700000, "tsostsʼidi neeznádiin mííl")
+      , (800000, "tseebíidi neeznádiin mííl")
+      , (900000, "náhástʼéidi neeznádiin mííl")
+      , (1000000, "tʼááłáhádí mííltsoh")
+      , (1000001, "tʼááłáhádí mííltsoh tʼááłáʼí")
+      , (1234567, "tʼááłáhádí mííltsoh naakidi neeznádiin tádiin dóó baʼąą dį́įʼdi mííl ashdladi neeznádiin hastą́diin dóó baʼąą tsostsʼid")
+      , (2000000, "naakidi mííltsoh")
+      , (3000000, "táadi mííltsoh")
+      , (4000000, "dį́įʼdi mííltsoh")
+      , (5000000, "ashdladi mííltsoh")
+      , (6000000, "hastą́ądi mííltsoh")
+      , (7000000, "tsostsʼidi mííltsoh")
+      , (7654321, "tsostsʼidi mííltsoh hastą́ądi neeznádiin ashdladiin dóó baʼąą dį́įʼdi mííl táadi neeznádiin naadįįłaʼ")
+      , (8000000, "tseebíidi mííltsoh")
+      , (9000000, "náhástʼéidi mííltsoh")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/NEE/TestData.hs b/src-test/Text/Numeral/Language/NEE/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/NEE/TestData.hs
@@ -0,0 +1,141 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        nee
+
+[@Native name@]     Nêlêmwa-Nixumwak
+
+[@English name@]    Kumak
+-}
+module Text.Numeral.Language.NEE.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-nelemwa/en/nee/
+
+Note: This data uses only one Nêlêmwa numerical classifier. There are
+22 categories.
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "pwa-giik")
+      , (2, "pwa-du")
+      , (3, "pwa-gan")
+      , (4, "pwa-baak")
+      , (5, "pwa-nem")
+      , (6, "pwa-nem-giik")
+      , (7, "pwa-nem-du")
+      , (8, "pwa-nem-gan")
+      , (9, "pwa-nem-baak")
+      , (10, "tujic")
+      , (11, "tujic xa bwaat pwagiik")
+      , (12, "tujic xa bwaat pwadu")
+      , (13, "tujic xa bwaat pwagan")
+      , (14, "tujic xa bwaat pwabaak")
+      , (15, "tujic xa bwaat pwanem")
+      , (16, "tujic xa bwaat pwanemgiik")
+      , (17, "tujic xa bwaat pwanemdu")
+      , (18, "tujic xa bwaat pwanemgan")
+      , (19, "tujic xa bwaat pwanembaak")
+      , (20, "aaxi ak")
+      , (21, "aaxi ak xa bwaat pwagiik")
+      , (22, "aaxi ak xa bwaat pwadu")
+      , (23, "aaxi ak xa bwaat pwagan")
+      , (24, "aaxi ak xa bwaat pwabaak")
+      , (25, "aaxi ak xa bwaat pwanem")
+      , (26, "aaxi ak xa bwaat pwanemgiik")
+      , (27, "aaxi ak xa bwaat pwanemdu")
+      , (28, "aaxi ak xa bwaat pwanemgan")
+      , (29, "aaxi ak xa bwaat pwanembaak")
+      , (30, "aaxi ak xa bwaat tujic")
+      , (31, "aaxi ak xa bwaat tujic xa bwaat pwagiik")
+      , (32, "aaxi ak xa bwaat tujic xa bwaat pwadu")
+      , (33, "aaxi ak xa bwaat tujic xa bwaat pwagan")
+      , (34, "aaxi ak xa bwaat tujic xa bwaat pwabaak")
+      , (35, "aaxi ak xa bwaat tujic xa bwaat pwanem")
+      , (36, "aaxi ak xa bwaat tujic xa bwaat pwanemgiik")
+      , (37, "aaxi ak xa bwaat tujic xa bwaat pwanemdu")
+      , (38, "aaxi ak xa bwaat tujic xa bwaat pwanemgan")
+      , (39, "aaxi ak xa bwaat tujic xa bwaat pwanembaak")
+      , (40, "aaru ak")
+      , (41, "aaru ak xa bwaat pwagiik")
+      , (42, "aaru ak xa bwaat pwadu")
+      , (43, "aaru ak xa bwaat pwagan")
+      , (44, "aaru ak xa bwaat pwabaak")
+      , (45, "aaru ak xa bwaat pwanem")
+      , (46, "aaru ak xa bwaat pwanemgiik")
+      , (47, "aaru ak xa bwaat pwanemdu")
+      , (48, "aaru ak xa bwaat pwanemgan")
+      , (49, "aaru ak xa bwaat pwanembaak")
+      , (50, "aaru ak xa bwaat tujic")
+      , (51, "aaru ak xa bwaat tujic xa bwaat pwagiik")
+      , (52, "aaru ak xa bwaat tujic xa bwaat pwadu")
+      , (53, "aaru ak xa bwaat tujic xa bwaat pwagan")
+      , (54, "aaru ak xa bwaat tujic xa bwaat pwabaak")
+      , (55, "aaru ak xa bwaat tujic xa bwaat pwanem")
+      , (56, "aaru ak xa bwaat tujic xa bwaat pwanemgiik")
+      , (57, "aaru ak xa bwaat tujic xa bwaat pwanemdu")
+      , (58, "aaru ak xa bwaat tujic xa bwaat pwanemgan")
+      , (59, "aaru ak xa bwaat tujic xa bwaat pwanembaak")
+      , (60, "aaxan ak")
+      , (61, "aaxan ak xa bwaat pwagiik")
+      , (62, "aaxan ak xa bwaat pwadu")
+      , (63, "aaxan ak xa bwaat pwagan")
+      , (64, "aaxan ak xa bwaat pwabaak")
+      , (65, "aaxan ak xa bwaat pwanem")
+      , (66, "aaxan ak xa bwaat pwanemgiik")
+      , (67, "aaxan ak xa bwaat pwanemdu")
+      , (68, "aaxan ak xa bwaat pwanemgan")
+      , (69, "aaxan ak xa bwaat pwanembaak")
+      , (70, "aaxan ak xa bwaat tujic")
+      , (71, "aaxan ak xa bwaat tujic xa bwaat pwagiik")
+      , (72, "aaxan ak xa bwaat tujic xa bwaat pwadu")
+      , (73, "aaxan ak xa bwaat tujic xa bwaat pwagan")
+      , (74, "aaxan ak xa bwaat tujic xa bwaat pwabaak")
+      , (75, "aaxan ak xa bwaat tujic xa bwaat pwanem")
+      , (76, "aaxan ak xa bwaat tujic xa bwaat pwanemgiik")
+      , (77, "aaxan ak xa bwaat tujic xa bwaat pwanemdu")
+      , (78, "aaxan ak xa bwaat tujic xa bwaat pwanemgan")
+      , (79, "aaxan ak xa bwaat tujic xa bwaat pwanembaak")
+      , (80, "aavaak ak")
+      , (81, "aavaak ak xa bwaat pwagiik")
+      , (82, "aavaak ak xa bwaat pwadu")
+      , (83, "aavaak ak xa bwaat pwagan")
+      , (84, "aavaak ak xa bwaat pwabaak")
+      , (85, "aavaak ak xa bwaat pwanem")
+      , (86, "aavaak ak xa bwaat pwanemgiik")
+      , (87, "aavaak ak xa bwaat pwanemdu")
+      , (88, "aavaak ak xa bwaat pwanemgan")
+      , (89, "aavaak ak xa bwaat pwanembaak")
+      , (90, "aavaak ak xa bwaat tujic")
+      , (91, "aavaak ak xa bwaat tujic xa bwaat pwagiik")
+      , (92, "aavaak ak xa bwaat tujic xa bwaat pwadu")
+      , (93, "aavaak ak xa bwaat tujic xa bwaat pwagan")
+      , (94, "aavaak ak xa bwaat tujic xa bwaat pwabaak")
+      , (95, "aavaak ak xa bwaat tujic xa bwaat pwanem")
+      , (96, "aavaak ak xa bwaat tujic xa bwaat pwanemgiik")
+      , (97, "aavaak ak xa bwaat tujic xa bwaat pwanemdu")
+      , (98, "aavaak ak xa bwaat tujic xa bwaat pwanemgan")
+      , (99, "aavaak ak xa bwaat tujic xa bwaat pwanembaak")
+      , (100, "aanem ak")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/NEN/TestData.hs b/src-test/Text/Numeral/Language/NEN/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/NEN/TestData.hs
@@ -0,0 +1,68 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        nen
+
+[@Native name@]     -
+
+[@English name@]    Nengone
+-}
+module Text.Numeral.Language.NEN.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-nengone/en/nen/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "sa")
+      , (2, "rewe")
+      , (3, "tini")
+      , (4, "ece")
+      , (5, "sedong")
+      , (6, "sedong ne sa")
+      , (7, "sedong ne rew")
+      , (8, "sedong ne tin")
+      , (9, "sedong ne ec")
+      , (10, "ruenin")
+      , (11, "ruenin ne sa")
+      , (12, "ruenin ne rew")
+      , (13, "ruenin ne tin")
+      , (14, "ruenin ne ec")
+      , (15, "adenin")
+      , (16, "adenin ne sa")
+      , (17, "adenin ne rew")
+      , (18, "adenin ne tin")
+      , (19, "adenin ne ec")
+      , (20, "sarengom")
+      , (21, "sarengom ne sa")
+      , (22, "sarengom ne rew")
+      , (23, "sarengom ne tin")
+      , (24, "sarengom ne ec")
+      , (25, "sarengom ne sedong")
+      , (26, "sarengom ne sedosa")
+      , (27, "sarengom ne sedorew")
+      , (28, "sarengom ne sedotin")
+      , (29, "sarengom ne sedoec")
+      , (30, "sarengom ne ruenin")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/NL/TestData.hs b/src-test/Text/Numeral/Language/NL/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/NL/TestData.hs
+++ /dev/null
@@ -1,380 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        nl
-
-[@ISO639-2B@]       dut
-
-[@ISO639-3@]        nld
-
-[@Native name@]     Nederlands
-
-[@English name@]    Dutch
--}
-
-module Text.Numeral.Language.NL.TestData
-    ( cardinals
-    , ordinals
-    , partitives
-    , multiplicatives
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "singular"
-    , singular defaultInflection
-    , [ (0, "nul")
-      , (1, "één")
-      , (2, "twee")
-      , (3, "drie")
-      , (4, "vier")
-      , (5, "vijf")
-      , (6, "zes")
-      , (7, "zeven")
-      , (8, "acht")
-      , (9, "negen")
-      , (10, "tien")
-      , (11, "elf")
-      , (12, "twaalf")
-      , (13, "dertien")
-      , (14, "veertien")
-      , (15, "vijftien")
-      , (16, "zestien")
-      , (17, "zeventien")
-      , (18, "achtien")
-      , (19, "negentien")
-      , (20, "twintig")
-      , (21, "éénentwintig")
-      , (22, "tweeëntwintig")
-      , (23, "drieëntwintig")
-      , (24, "vierentwintig")
-      , (25, "vijfentwintig")
-      , (26, "zesentwintig")
-      , (27, "zevenentwintig")
-      , (28, "achtentwintig")
-      , (29, "negenentwintig")
-      , (30, "dertig")
-      , (31, "éénendertig")
-      , (32, "tweeëndertig")
-      , (33, "drieëndertig")
-      , (34, "vierendertig")
-      , (35, "vijfendertig")
-      , (36, "zesendertig")
-      , (37, "zevenendertig")
-      , (38, "achtendertig")
-      , (39, "negenendertig")
-      , (40, "veertig")
-      , (41, "éénenveertig")
-      , (42, "tweeënveertig")
-      , (43, "drieënveertig")
-      , (44, "vierenveertig")
-      , (45, "vijfenveertig")
-      , (46, "zesenveertig")
-      , (47, "zevenenveertig")
-      , (48, "achtenveertig")
-      , (49, "negenenveertig")
-      , (50, "vijftig")
-      , (51, "éénenvijftig")
-      , (52, "tweeënvijftig")
-      , (53, "drieënvijftig")
-      , (54, "vierenvijftig")
-      , (55, "vijfenvijftig")
-      , (56, "zesenvijftig")
-      , (57, "zevenenvijftig")
-      , (58, "achtenvijftig")
-      , (59, "negenenvijftig")
-      , (60, "zestig")
-      , (61, "éénenzestig")
-      , (62, "tweeënzestig")
-      , (63, "drieënzestig")
-      , (64, "vierenzestig")
-      , (65, "vijfenzestig")
-      , (66, "zesenzestig")
-      , (67, "zevenenzestig")
-      , (68, "achtenzestig")
-      , (69, "negenenzestig")
-      , (70, "zeventig")
-      , (71, "éénenzeventig")
-      , (72, "tweeënzeventig")
-      , (73, "drieënzeventig")
-      , (74, "vierenzeventig")
-      , (75, "vijfenzeventig")
-      , (76, "zesenzeventig")
-      , (77, "zevenenzeventig")
-      , (78, "achtenzeventig")
-      , (79, "negenenzeventig")
-      , (80, "tachtig")
-      , (81, "éénentachtig")
-      , (82, "tweeëntachtig")
-      , (83, "drieëntachtig")
-      , (84, "vierentachtig")
-      , (85, "vijfentachtig")
-      , (86, "zesentachtig")
-      , (87, "zevenentachtig")
-      , (88, "achtentachtig")
-      , (89, "negenentachtig")
-      , (90, "negentig")
-      , (91, "éénennegentig")
-      , (92, "tweeënnegentig")
-      , (93, "drieënnegentig")
-      , (94, "vierennegentig")
-      , (95, "vijfennegentig")
-      , (96, "zesennegentig")
-      , (97, "zevenennegentig")
-      , (98, "achtennegentig")
-      , (99, "negenennegentig")
-      , (100, "honderd")
-      , (101, "honderdéén")
-      , (108, "honderdacht")
-      , (118, "honderdachtien")
-      , (115, "honderdvijftien")
-      , (500, "vijfhonderd")
-      , (999, "negenhonderdnegenennegentig")
-      , (1000, "duizend")
-      , (1001, "duizendéén")
-      , (1008, "duizendacht")
-      , (8000, "achtduizend")
-      , (900000, "negenhonderdduizend")
-      , (dec 6, "miljoen")
-      , (dec 9, "miljard")
-      , (dec 12, "biljoen")
-      , (dec 15, "biljard")
-      , (dec 18, "triljoen")
-      , (dec 21, "triljard")
-      , (dec 24, "quadriljoen")
-      , (dec 27, "quadriljard")
-      ]
-    )
-  , ( "plural"
-    , plural defaultInflection
-    , [ (1, "éénen")
-      , (2, "tweeën")
-      , (3, "drieën")
-      , (4, "vieren")
-      , (5, "vijven")
-      , (6, "zessen")
-      , (7, "zevens")
-      , (8, "achten")
-      , (9, "negens")
-      , (10, "tienen")
-      , (11, "elven")
-      , (12, "twaalven")
-      , (13, "dertiens")
-      , (14, "veertiens")
-      , (15, "vijftiens")
-      , (16, "zestiens")
-      , (17, "zeventiens")
-      , (18, "achtiens")
-      , (19, "negentiens")
-      , (20, "twintigs")
-      , (100, "honderden")
-      , (1000, "duizenden")
-      , (dec 6, "miljoenen")
-      , (dec 9, "miljarden")
-      , (dec 12, "biljoenen")
-      , (dec 15, "biljarden")
-      ]
-    )
-  , ( "dative"
-    , dative defaultInflection
-    , [ (1, "éénen")
-      , (2, "tweeën")
-      , (3, "drieën")
-      , (4, "vieren")
-      , (5, "vijven")
-      , (6, "zessen")
-      , (7, "zevenen")
-      , (8, "achten")
-      , (9, "negenen")
-      , (10, "tienen")
-      , (11, "elven")
-      , (12, "twaalven")
-      , (13, "dertienen")
-      , (14, "veertienen")
-      , (15, "vijftienen")
-      , (16, "zestienen")
-      , (17, "zeventienen")
-      , (18, "achtienen")
-      , (19, "negentienen")
-      , (20, "twintigen")
-      , (23, "drieëntwintigen")
-      , (100, "honderden")
-      , (1000, "duizenden")
-      , (dec 6, "miljoenen")
-      , (dec 9, "miljarden")
-      , (dec 12, "biljoenen")
-      , (dec 15, "biljarden")
-      ]
-    )
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "eerste")
-      , (2, "tweede")
-      , (3, "derde")
-      , (4, "vierde")
-      , (5, "vijfde")
-      , (6, "zesde")
-      , (7, "zevende")
-      , (8, "achtste")
-      , (9, "negende")
-      , (10, "tiende")
-      , (11, "elfde")
-      , (12, "twaalfde")
-      , (13, "dertiende")
-      , (14, "veertiende")
-      , (15, "vijftiende")
-      , (16, "zestiende")
-      , (17, "zeventiende")
-      , (18, "achtiende")
-      , (19, "negentiende")
-      , (20, "twintigste")
-      , (21, "éénentwintigste")
-      , (22, "tweeëntwintigste")
-      , (23, "drieëntwintigste")
-      , (24, "vierentwintigste")
-      , (25, "vijfentwintigste")
-      , (26, "zesentwintigste")
-      , (27, "zevenentwintigste")
-      , (28, "achtentwintigste")
-      , (29, "negenentwintigste")
-      , (30, "dertigste")
-      , (31, "éénendertigste")
-      , (32, "tweeëndertigste")
-      , (33, "drieëndertigste")
-      , (34, "vierendertigste")
-      , (35, "vijfendertigste")
-      , (36, "zesendertigste")
-      , (37, "zevenendertigste")
-      , (38, "achtendertigste")
-      , (39, "negenendertigste")
-      , (40, "veertigste")
-      , (41, "éénenveertigste")
-      , (42, "tweeënveertigste")
-      , (43, "drieënveertigste")
-      , (44, "vierenveertigste")
-      , (45, "vijfenveertigste")
-      , (46, "zesenveertigste")
-      , (47, "zevenenveertigste")
-      , (48, "achtenveertigste")
-      , (49, "negenenveertigste")
-      , (50, "vijftigste")
-      , (51, "éénenvijftigste")
-      , (52, "tweeënvijftigste")
-      , (53, "drieënvijftigste")
-      , (54, "vierenvijftigste")
-      , (55, "vijfenvijftigste")
-      , (56, "zesenvijftigste")
-      , (57, "zevenenvijftigste")
-      , (58, "achtenvijftigste")
-      , (59, "negenenvijftigste")
-      , (60, "zestigste")
-      , (61, "éénenzestigste")
-      , (62, "tweeënzestigste")
-      , (63, "drieënzestigste")
-      , (64, "vierenzestigste")
-      , (65, "vijfenzestigste")
-      , (66, "zesenzestigste")
-      , (67, "zevenenzestigste")
-      , (68, "achtenzestigste")
-      , (69, "negenenzestigste")
-      , (70, "zeventigste")
-      , (71, "éénenzeventigste")
-      , (72, "tweeënzeventigste")
-      , (73, "drieënzeventigste")
-      , (74, "vierenzeventigste")
-      , (75, "vijfenzeventigste")
-      , (76, "zesenzeventigste")
-      , (77, "zevenenzeventigste")
-      , (78, "achtenzeventigste")
-      , (79, "negenenzeventigste")
-      , (80, "tachtigste")
-      , (81, "éénentachtigste")
-      , (82, "tweeëntachtigste")
-      , (83, "drieëntachtigste")
-      , (84, "vierentachtigste")
-      , (85, "vijfentachtigste")
-      , (86, "zesentachtigste")
-      , (87, "zevenentachtigste")
-      , (88, "achtentachtigste")
-      , (89, "negenentachtigste")
-      , (90, "negentigste")
-      , (91, "éénennegentigste")
-      , (92, "tweeënnegentigste")
-      , (93, "drieënnegentigste")
-      , (94, "vierennegentigste")
-      , (95, "vijfennegentigste")
-      , (96, "zesennegentigste")
-      , (97, "zevenennegentigste")
-      , (98, "achtennegentigste")
-      , (99, "negenennegentigste")
-      , (100, "honderdste")
-      ]
-    )
-  ]
-
-partitives ∷ (Integral i) ⇒ TestData (i, i)
-partitives =
-  [ ("singular", singular defaultInflection, testData)
-  , ("ignored plural", plural defaultInflection, testData)
-  , ("ignored dative", dative defaultInflection, testData)
-  ]
-  where
-    testData =
-      [ ((0, 1), "nul éénde")
-      , ((1, 1), "één éénde")
-      , ((0, 2), "nul tweede")
-      , ((1, 2), "één tweede")  -- optionally "de helft"
-      , ((2, 2), "twee tweede")
-      , ((1, 3), "één derde")
-      , ((2, 3), "twee derde")
-      , ((1, 4), "één vierde")  -- optionally "één kwart"
-      , ((2, 4), "twee vierde") -- optionally "twee kwart"
-      , ((3, 4), "drie vierde") -- optionally "drie kwart"
-      , ((4, 4), "vier vierde") -- optionally "vier kwart"
-      , ((1, 5), "één vijfde")
-      , ((2, 5), "twee vijfde")
-      , ((1, 10), "één tiende")
-      , ((1, 100), "één honderdste")
-      , ((12, 144), "twaalf honderdvierenveertigste")
-      , ((-1, 2), "min één tweede")
-      , ((2, -3), "twee min derde")
-      , ((-3, -5), "min drie min vijfde")
-      ]
-
-multiplicatives ∷ (Integral i) ⇒ TestData i
-multiplicatives =
-  [ ("singular", singular defaultInflection, testData)
-  , ("ignored plural", plural defaultInflection, testData)
-  , ("ignored dative", dative defaultInflection, testData)
-  ]
-  where
-    testData =
-      [ (1, "éénmaal")
-      , (2, "tweemaal")
-      , (3, "driemaal")
-      , (10, "tienmaal")
-      ]
diff --git a/src-test/Text/Numeral/Language/NLD/TestData.hs b/src-test/Text/Numeral/Language/NLD/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/NLD/TestData.hs
@@ -0,0 +1,373 @@
+{-|
+[@ISO639-1@]        nl
+
+[@ISO639-2B@]       dut
+
+[@ISO639-3@]        nld
+
+[@Native name@]     Nederlands
+
+[@English name@]    Dutch
+-}
+
+module Text.Numeral.Language.NLD.TestData
+    ( cardinals
+    , ordinals
+    , partitives
+    , multiplicatives
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "singular"
+    , singular defaultInflection
+    , [ (0, "nul")
+      , (1, "één")
+      , (2, "twee")
+      , (3, "drie")
+      , (4, "vier")
+      , (5, "vijf")
+      , (6, "zes")
+      , (7, "zeven")
+      , (8, "acht")
+      , (9, "negen")
+      , (10, "tien")
+      , (11, "elf")
+      , (12, "twaalf")
+      , (13, "dertien")
+      , (14, "veertien")
+      , (15, "vijftien")
+      , (16, "zestien")
+      , (17, "zeventien")
+      , (18, "achtien")
+      , (19, "negentien")
+      , (20, "twintig")
+      , (21, "éénentwintig")
+      , (22, "tweeëntwintig")
+      , (23, "drieëntwintig")
+      , (24, "vierentwintig")
+      , (25, "vijfentwintig")
+      , (26, "zesentwintig")
+      , (27, "zevenentwintig")
+      , (28, "achtentwintig")
+      , (29, "negenentwintig")
+      , (30, "dertig")
+      , (31, "éénendertig")
+      , (32, "tweeëndertig")
+      , (33, "drieëndertig")
+      , (34, "vierendertig")
+      , (35, "vijfendertig")
+      , (36, "zesendertig")
+      , (37, "zevenendertig")
+      , (38, "achtendertig")
+      , (39, "negenendertig")
+      , (40, "veertig")
+      , (41, "éénenveertig")
+      , (42, "tweeënveertig")
+      , (43, "drieënveertig")
+      , (44, "vierenveertig")
+      , (45, "vijfenveertig")
+      , (46, "zesenveertig")
+      , (47, "zevenenveertig")
+      , (48, "achtenveertig")
+      , (49, "negenenveertig")
+      , (50, "vijftig")
+      , (51, "éénenvijftig")
+      , (52, "tweeënvijftig")
+      , (53, "drieënvijftig")
+      , (54, "vierenvijftig")
+      , (55, "vijfenvijftig")
+      , (56, "zesenvijftig")
+      , (57, "zevenenvijftig")
+      , (58, "achtenvijftig")
+      , (59, "negenenvijftig")
+      , (60, "zestig")
+      , (61, "éénenzestig")
+      , (62, "tweeënzestig")
+      , (63, "drieënzestig")
+      , (64, "vierenzestig")
+      , (65, "vijfenzestig")
+      , (66, "zesenzestig")
+      , (67, "zevenenzestig")
+      , (68, "achtenzestig")
+      , (69, "negenenzestig")
+      , (70, "zeventig")
+      , (71, "éénenzeventig")
+      , (72, "tweeënzeventig")
+      , (73, "drieënzeventig")
+      , (74, "vierenzeventig")
+      , (75, "vijfenzeventig")
+      , (76, "zesenzeventig")
+      , (77, "zevenenzeventig")
+      , (78, "achtenzeventig")
+      , (79, "negenenzeventig")
+      , (80, "tachtig")
+      , (81, "éénentachtig")
+      , (82, "tweeëntachtig")
+      , (83, "drieëntachtig")
+      , (84, "vierentachtig")
+      , (85, "vijfentachtig")
+      , (86, "zesentachtig")
+      , (87, "zevenentachtig")
+      , (88, "achtentachtig")
+      , (89, "negenentachtig")
+      , (90, "negentig")
+      , (91, "éénennegentig")
+      , (92, "tweeënnegentig")
+      , (93, "drieënnegentig")
+      , (94, "vierennegentig")
+      , (95, "vijfennegentig")
+      , (96, "zesennegentig")
+      , (97, "zevenennegentig")
+      , (98, "achtennegentig")
+      , (99, "negenennegentig")
+      , (100, "honderd")
+      , (101, "honderdéén")
+      , (108, "honderdacht")
+      , (118, "honderdachtien")
+      , (115, "honderdvijftien")
+      , (500, "vijfhonderd")
+      , (999, "negenhonderdnegenennegentig")
+      , (1000, "duizend")
+      , (1001, "duizendéén")
+      , (1008, "duizendacht")
+      , (8000, "achtduizend")
+      , (900000, "negenhonderdduizend")
+      , (dec 6, "miljoen")
+      , (dec 9, "miljard")
+      , (dec 12, "biljoen")
+      , (dec 15, "biljard")
+      , (dec 18, "triljoen")
+      , (dec 21, "triljard")
+      , (dec 24, "quadriljoen")
+      , (dec 27, "quadriljard")
+      ]
+    )
+  , ( "plural"
+    , plural defaultInflection
+    , [ (1, "éénen")
+      , (2, "tweeën")
+      , (3, "drieën")
+      , (4, "vieren")
+      , (5, "vijven")
+      , (6, "zessen")
+      , (7, "zevens")
+      , (8, "achten")
+      , (9, "negens")
+      , (10, "tienen")
+      , (11, "elven")
+      , (12, "twaalven")
+      , (13, "dertiens")
+      , (14, "veertiens")
+      , (15, "vijftiens")
+      , (16, "zestiens")
+      , (17, "zeventiens")
+      , (18, "achtiens")
+      , (19, "negentiens")
+      , (20, "twintigs")
+      , (100, "honderden")
+      , (1000, "duizenden")
+      , (dec 6, "miljoenen")
+      , (dec 9, "miljarden")
+      , (dec 12, "biljoenen")
+      , (dec 15, "biljarden")
+      ]
+    )
+  , ( "dative"
+    , dative defaultInflection
+    , [ (1, "éénen")
+      , (2, "tweeën")
+      , (3, "drieën")
+      , (4, "vieren")
+      , (5, "vijven")
+      , (6, "zessen")
+      , (7, "zevenen")
+      , (8, "achten")
+      , (9, "negenen")
+      , (10, "tienen")
+      , (11, "elven")
+      , (12, "twaalven")
+      , (13, "dertienen")
+      , (14, "veertienen")
+      , (15, "vijftienen")
+      , (16, "zestienen")
+      , (17, "zeventienen")
+      , (18, "achtienen")
+      , (19, "negentienen")
+      , (20, "twintigen")
+      , (23, "drieëntwintigen")
+      , (100, "honderden")
+      , (1000, "duizenden")
+      , (dec 6, "miljoenen")
+      , (dec 9, "miljarden")
+      , (dec 12, "biljoenen")
+      , (dec 15, "biljarden")
+      ]
+    )
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "eerste")
+      , (2, "tweede")
+      , (3, "derde")
+      , (4, "vierde")
+      , (5, "vijfde")
+      , (6, "zesde")
+      , (7, "zevende")
+      , (8, "achtste")
+      , (9, "negende")
+      , (10, "tiende")
+      , (11, "elfde")
+      , (12, "twaalfde")
+      , (13, "dertiende")
+      , (14, "veertiende")
+      , (15, "vijftiende")
+      , (16, "zestiende")
+      , (17, "zeventiende")
+      , (18, "achtiende")
+      , (19, "negentiende")
+      , (20, "twintigste")
+      , (21, "éénentwintigste")
+      , (22, "tweeëntwintigste")
+      , (23, "drieëntwintigste")
+      , (24, "vierentwintigste")
+      , (25, "vijfentwintigste")
+      , (26, "zesentwintigste")
+      , (27, "zevenentwintigste")
+      , (28, "achtentwintigste")
+      , (29, "negenentwintigste")
+      , (30, "dertigste")
+      , (31, "éénendertigste")
+      , (32, "tweeëndertigste")
+      , (33, "drieëndertigste")
+      , (34, "vierendertigste")
+      , (35, "vijfendertigste")
+      , (36, "zesendertigste")
+      , (37, "zevenendertigste")
+      , (38, "achtendertigste")
+      , (39, "negenendertigste")
+      , (40, "veertigste")
+      , (41, "éénenveertigste")
+      , (42, "tweeënveertigste")
+      , (43, "drieënveertigste")
+      , (44, "vierenveertigste")
+      , (45, "vijfenveertigste")
+      , (46, "zesenveertigste")
+      , (47, "zevenenveertigste")
+      , (48, "achtenveertigste")
+      , (49, "negenenveertigste")
+      , (50, "vijftigste")
+      , (51, "éénenvijftigste")
+      , (52, "tweeënvijftigste")
+      , (53, "drieënvijftigste")
+      , (54, "vierenvijftigste")
+      , (55, "vijfenvijftigste")
+      , (56, "zesenvijftigste")
+      , (57, "zevenenvijftigste")
+      , (58, "achtenvijftigste")
+      , (59, "negenenvijftigste")
+      , (60, "zestigste")
+      , (61, "éénenzestigste")
+      , (62, "tweeënzestigste")
+      , (63, "drieënzestigste")
+      , (64, "vierenzestigste")
+      , (65, "vijfenzestigste")
+      , (66, "zesenzestigste")
+      , (67, "zevenenzestigste")
+      , (68, "achtenzestigste")
+      , (69, "negenenzestigste")
+      , (70, "zeventigste")
+      , (71, "éénenzeventigste")
+      , (72, "tweeënzeventigste")
+      , (73, "drieënzeventigste")
+      , (74, "vierenzeventigste")
+      , (75, "vijfenzeventigste")
+      , (76, "zesenzeventigste")
+      , (77, "zevenenzeventigste")
+      , (78, "achtenzeventigste")
+      , (79, "negenenzeventigste")
+      , (80, "tachtigste")
+      , (81, "éénentachtigste")
+      , (82, "tweeëntachtigste")
+      , (83, "drieëntachtigste")
+      , (84, "vierentachtigste")
+      , (85, "vijfentachtigste")
+      , (86, "zesentachtigste")
+      , (87, "zevenentachtigste")
+      , (88, "achtentachtigste")
+      , (89, "negenentachtigste")
+      , (90, "negentigste")
+      , (91, "éénennegentigste")
+      , (92, "tweeënnegentigste")
+      , (93, "drieënnegentigste")
+      , (94, "vierennegentigste")
+      , (95, "vijfennegentigste")
+      , (96, "zesennegentigste")
+      , (97, "zevenennegentigste")
+      , (98, "achtennegentigste")
+      , (99, "negenennegentigste")
+      , (100, "honderdste")
+      ]
+    )
+  ]
+
+partitives :: (Integral i) => TestData (i, i)
+partitives =
+  [ ("singular", singular defaultInflection, testData)
+  , ("ignored plural", plural defaultInflection, testData)
+  , ("ignored dative", dative defaultInflection, testData)
+  ]
+  where
+    testData =
+      [ ((0, 1), "nul éénde")
+      , ((1, 1), "één éénde")
+      , ((0, 2), "nul tweede")
+      , ((1, 2), "één tweede")  -- optionally "de helft"
+      , ((2, 2), "twee tweede")
+      , ((1, 3), "één derde")
+      , ((2, 3), "twee derde")
+      , ((1, 4), "één vierde")  -- optionally "één kwart"
+      , ((2, 4), "twee vierde") -- optionally "twee kwart"
+      , ((3, 4), "drie vierde") -- optionally "drie kwart"
+      , ((4, 4), "vier vierde") -- optionally "vier kwart"
+      , ((1, 5), "één vijfde")
+      , ((2, 5), "twee vijfde")
+      , ((1, 10), "één tiende")
+      , ((1, 100), "één honderdste")
+      , ((12, 144), "twaalf honderdvierenveertigste")
+      , ((-1, 2), "min één tweede")
+      , ((2, -3), "twee min derde")
+      , ((-3, -5), "min drie min vijfde")
+      ]
+
+multiplicatives :: (Integral i) => TestData i
+multiplicatives =
+  [ ("singular", singular defaultInflection, testData)
+  , ("ignored plural", plural defaultInflection, testData)
+  , ("ignored dative", dative defaultInflection, testData)
+  ]
+  where
+    testData =
+      [ (1, "éénmaal")
+      , (2, "tweemaal")
+      , (3, "driemaal")
+      , (10, "tienmaal")
+      ]
diff --git a/src-test/Text/Numeral/Language/NO/TestData.hs b/src-test/Text/Numeral/Language/NO/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/NO/TestData.hs
+++ /dev/null
@@ -1,170 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        nb
-
-[@ISO639-2B@]       nob
-
-[@ISO639-3@]        nob
-
-[@Native name@]     Bokmål
-
-[@English name@]    Norwegian Bokmål
--}
-
-module Text.Numeral.Language.NO.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
--- Sources:
---   http://en.wikibooks.org/wiki/Norwegian_Numbers
---   http://www.sf.airnet.ne.jp/~ts/language/number/norwegian.html
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "null")
-      , (1, "én")
-      , (2, "to")
-      , (3, "tre")
-      , (4, "fire")
-      , (5, "fem")
-      , (6, "seks")
-      , (7, "sju")
-      , (8, "åtte")
-      , (9, "ni")
-      , (10, "ti")
-      , (11, "elleve")
-      , (12, "tolv")
-      , (13, "tretten")
-      , (14, "fjorten")
-      , (15, "femten")
-      , (16, "seksten")
-      , (17, "sytten")
-      , (18, "atten")
-      , (19, "nitten")
-      , (20, "tjue")
-      , (21, "tjueen")
-      , (22, "tjueto")
-      , (23, "tjuetre")
-      , (24, "tjuefire")
-      , (25, "tjuefem")
-      , (26, "tjueseks")
-      , (27, "tjuesju")
-      , (28, "tjueåtte")
-      , (29, "tjueni")
-      , (30, "tretti")
-      , (31, "trettien")
-      , (32, "trettito")
-      , (33, "trettitre")
-      , (34, "trettifire")
-      , (35, "trettifem")
-      , (36, "trettiseks")
-      , (37, "trettisju")
-      , (38, "trettiåtte")
-      , (39, "trettini")
-      , (40, "førti")
-      , (41, "førtien")
-      , (42, "førtito")
-      , (43, "førtitre")
-      , (44, "førtifire")
-      , (45, "førtifem")
-      , (46, "førtiseks")
-      , (47, "førtisju")
-      , (48, "førtiåtte")
-      , (49, "førtini")
-      , (50, "femti")
-      , (51, "femtien")
-      , (52, "femtito")
-      , (53, "femtitre")
-      , (54, "femtifire")
-      , (55, "femtifem")
-      , (56, "femtiseks")
-      , (57, "femtisju")
-      , (58, "femtiåtte")
-      , (59, "femtini")
-      , (60, "seksti")
-      , (61, "sekstien")
-      , (62, "sekstito")
-      , (63, "sekstitre")
-      , (64, "sekstifire")
-      , (65, "sekstifem")
-      , (66, "sekstiseks")
-      , (67, "sekstisju")
-      , (68, "sekstiåtte")
-      , (69, "sekstini")
-      , (70, "sytti")
-      , (71, "syttien")
-      , (72, "syttito")
-      , (73, "syttitre")
-      , (74, "syttifire")
-      , (75, "syttifem")
-      , (76, "syttiseks")
-      , (77, "syttisju")
-      , (78, "syttiåtte")
-      , (79, "syttini")
-      , (80, "åtti")
-      , (81, "åttien")
-      , (82, "åttito")
-      , (83, "åttitre")
-      , (84, "åttifire")
-      , (85, "åttifem")
-      , (86, "åttiseks")
-      , (87, "åttisju")
-      , (88, "åttiåtte")
-      , (89, "åttini")
-      , (90, "nitti")
-      , (91, "nittien")
-      , (92, "nittito")
-      , (93, "nittitre")
-      , (94, "nittifire")
-      , (95, "nittifem")
-      , (96, "nittiseks")
-      , (97, "nittisju")
-      , (98, "nittiåtte")
-      , (99, "nittini")
-      , (100, "hundre")
-      , (123, "hundre tjuetre")
-      , (200, "to hundre")
-      , (300, "tre hundre")
-      , (400, "fire hundre")
-      , (500, "fem hundre")
-      , (600, "seks hundre")
-      , (700, "sju hundre")
-      , (800, "åtte hundre")
-      , (900, "ni hundre")
-      , (1000, "tusen")
-      , (1023, "tusen tjuetre")
-      , (2000, "totusen")
-      , (3000, "tretusen")
-      , (4000, "firetusen")
-      , (5000, "femtusen")
-      , (6000, "sekstusen")
-      , (7000, "sjutusen")
-      , (8000, "åttetusen")
-      , (9000, "nitusen")
-      , (10000, "titusen")
-      , (dec 6, "million")
-      , (2 ⋅ dec 6, "to millioner")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/NOB/TestData.hs b/src-test/Text/Numeral/Language/NOB/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/NOB/TestData.hs
@@ -0,0 +1,162 @@
+{-|
+[@ISO639-1@]        nb
+
+[@ISO639-2B@]       nob
+
+[@ISO639-3@]        nob
+
+[@Native name@]     Bokmål
+
+[@English name@]    Norwegian Bokmål
+-}
+
+module Text.Numeral.Language.NOB.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+-- Sources:
+--   http://en.wikibooks.org/wiki/Norwegian_Numbers
+--   http://www.sf.airnet.ne.jp/~ts/language/number/norwegian.html
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "null")
+      , (1, "én")
+      , (2, "to")
+      , (3, "tre")
+      , (4, "fire")
+      , (5, "fem")
+      , (6, "seks")
+      , (7, "sju")
+      , (8, "åtte")
+      , (9, "ni")
+      , (10, "ti")
+      , (11, "elleve")
+      , (12, "tolv")
+      , (13, "tretten")
+      , (14, "fjorten")
+      , (15, "femten")
+      , (16, "seksten")
+      , (17, "sytten")
+      , (18, "atten")
+      , (19, "nitten")
+      , (20, "tjue")
+      , (21, "tjueen")
+      , (22, "tjueto")
+      , (23, "tjuetre")
+      , (24, "tjuefire")
+      , (25, "tjuefem")
+      , (26, "tjueseks")
+      , (27, "tjuesju")
+      , (28, "tjueåtte")
+      , (29, "tjueni")
+      , (30, "tretti")
+      , (31, "trettien")
+      , (32, "trettito")
+      , (33, "trettitre")
+      , (34, "trettifire")
+      , (35, "trettifem")
+      , (36, "trettiseks")
+      , (37, "trettisju")
+      , (38, "trettiåtte")
+      , (39, "trettini")
+      , (40, "førti")
+      , (41, "førtien")
+      , (42, "førtito")
+      , (43, "førtitre")
+      , (44, "førtifire")
+      , (45, "førtifem")
+      , (46, "førtiseks")
+      , (47, "førtisju")
+      , (48, "førtiåtte")
+      , (49, "førtini")
+      , (50, "femti")
+      , (51, "femtien")
+      , (52, "femtito")
+      , (53, "femtitre")
+      , (54, "femtifire")
+      , (55, "femtifem")
+      , (56, "femtiseks")
+      , (57, "femtisju")
+      , (58, "femtiåtte")
+      , (59, "femtini")
+      , (60, "seksti")
+      , (61, "sekstien")
+      , (62, "sekstito")
+      , (63, "sekstitre")
+      , (64, "sekstifire")
+      , (65, "sekstifem")
+      , (66, "sekstiseks")
+      , (67, "sekstisju")
+      , (68, "sekstiåtte")
+      , (69, "sekstini")
+      , (70, "sytti")
+      , (71, "syttien")
+      , (72, "syttito")
+      , (73, "syttitre")
+      , (74, "syttifire")
+      , (75, "syttifem")
+      , (76, "syttiseks")
+      , (77, "syttisju")
+      , (78, "syttiåtte")
+      , (79, "syttini")
+      , (80, "åtti")
+      , (81, "åttien")
+      , (82, "åttito")
+      , (83, "åttitre")
+      , (84, "åttifire")
+      , (85, "åttifem")
+      , (86, "åttiseks")
+      , (87, "åttisju")
+      , (88, "åttiåtte")
+      , (89, "åttini")
+      , (90, "nitti")
+      , (91, "nittien")
+      , (92, "nittito")
+      , (93, "nittitre")
+      , (94, "nittifire")
+      , (95, "nittifem")
+      , (96, "nittiseks")
+      , (97, "nittisju")
+      , (98, "nittiåtte")
+      , (99, "nittini")
+      , (100, "hundre")
+      , (123, "hundre tjuetre")
+      , (200, "to hundre")
+      , (300, "tre hundre")
+      , (400, "fire hundre")
+      , (500, "fem hundre")
+      , (600, "seks hundre")
+      , (700, "sju hundre")
+      , (800, "åtte hundre")
+      , (900, "ni hundre")
+      , (1000, "tusen")
+      , (1023, "tusen tjuetre")
+      , (2000, "totusen")
+      , (3000, "tretusen")
+      , (4000, "firetusen")
+      , (5000, "femtusen")
+      , (6000, "sekstusen")
+      , (7000, "sjutusen")
+      , (8000, "åttetusen")
+      , (9000, "nitusen")
+      , (10000, "titusen")
+      , (dec 6, "million")
+      , (2 * dec 6, "to millioner")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/NQM/TestData.hs b/src-test/Text/Numeral/Language/NQM/TestData.hs
--- a/src-test/Text/Numeral/Language/NQM/TestData.hs
+++ b/src-test/Text/Numeral/Language/NQM/TestData.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -23,8 +17,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -32,7 +25,7 @@
 -- Test data
 --------------------------------------------------------------------------------
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/OCI/TestData.hs b/src-test/Text/Numeral/Language/OCI/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/OCI/TestData.hs
@@ -0,0 +1,221 @@
+{-|
+[@ISO639-1@]        oc
+
+[@ISO639-2@]        oci
+
+[@ISO639-3@]        oci
+
+[@Native name@]     occitan, lenga d'òc
+
+[@English name@]    Occitan
+-}
+module Text.Numeral.Language.OCI.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-occitan/en/oci/http://www.languagesandnumbers.com/how-to-count-in-occitan/en/oci/
+
+Note: This is the Languedocien dialect.
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "zèro")
+      , (1, "un")
+      , (2, "dos")
+      , (3, "tres")
+      , (4, "quatre")
+      , (5, "cinc")
+      , (6, "sièis")
+      , (7, "sèt")
+      , (8, "uèch")
+      , (9, "nòu")
+      , (10, "dètz")
+      , (11, "onze")
+      , (12, "dotze")
+      , (13, "tretze")
+      , (14, "catòrze")
+      , (15, "quinze")
+      , (16, "setze")
+      , (17, "dètz-e-sèt")
+      , (18, "dètz-e-uèch")
+      , (19, "dètz-e-nòu")
+      , (20, "vint")
+      , (21, "vint-e-un")
+      , (22, "vint-e-dos")
+      , (23, "vint-e-tres")
+      , (24, "vint-e-quatre")
+      , (25, "vint-e-cinc")
+      , (26, "vint-e-sièis")
+      , (27, "vint-e-sèt")
+      , (28, "vint-e-uèch")
+      , (29, "vint-e-nòu")
+      , (30, "trenta")
+      , (31, "trenta un")
+      , (32, "trenta dos")
+      , (33, "trenta tres")
+      , (34, "trenta quatre")
+      , (35, "trenta cinc")
+      , (36, "trenta sièis")
+      , (37, "trenta sèt")
+      , (38, "trenta uèch")
+      , (39, "trenta nòu")
+      , (40, "quaranta")
+      , (41, "quaranta un")
+      , (42, "quaranta dos")
+      , (43, "quaranta tres")
+      , (44, "quaranta quatre")
+      , (45, "quaranta cinc")
+      , (46, "quaranta sièis")
+      , (47, "quaranta sèt")
+      , (48, "quaranta uèch")
+      , (49, "quaranta nòu")
+      , (50, "cinquanta")
+      , (51, "cinquanta un")
+      , (52, "cinquanta dos")
+      , (53, "cinquanta tres")
+      , (54, "cinquanta quatre")
+      , (55, "cinquanta cinc")
+      , (56, "cinquanta sièis")
+      , (57, "cinquanta sèt")
+      , (58, "cinquanta uèch")
+      , (59, "cinquanta nòu")
+      , (60, "seissanta")
+      , (61, "seissanta un")
+      , (62, "seissanta dos")
+      , (63, "seissanta tres")
+      , (64, "seissanta quatre")
+      , (65, "seissanta cinc")
+      , (66, "seissanta sièis")
+      , (67, "seissanta sèt")
+      , (68, "seissanta uèch")
+      , (69, "seissanta nòu")
+      , (70, "setanta")
+      , (71, "setanta un")
+      , (72, "setanta dos")
+      , (73, "setanta tres")
+      , (74, "setanta quatre")
+      , (75, "setanta cinc")
+      , (76, "setanta sièis")
+      , (77, "setanta sèt")
+      , (78, "setanta uèch")
+      , (79, "setanta nòu")
+      , (80, "ochanta")
+      , (81, "ochanta un")
+      , (82, "ochanta dos")
+      , (83, "ochanta tres")
+      , (84, "ochanta quatre")
+      , (85, "ochanta cinc")
+      , (86, "ochanta sièis")
+      , (87, "ochanta sèt")
+      , (88, "ochanta uèch")
+      , (89, "ochanta nòu")
+      , (90, "nonanta")
+      , (91, "nonanta un")
+      , (92, "nonanta dos")
+      , (93, "nonanta tres")
+      , (94, "nonanta quatre")
+      , (95, "nonanta cinc")
+      , (96, "nonanta sièis")
+      , (97, "nonanta sèt")
+      , (98, "nonanta uèch")
+      , (99, "nonanta nòu")
+      , (100, "cent")
+      , (101, "cent un")
+      , (102, "cent dos")
+      , (103, "cent tres")
+      , (104, "cent quatre")
+      , (105, "cent cinc")
+      , (106, "cent sièis")
+      , (107, "cent sèt")
+      , (108, "cent uèch")
+      , (109, "cent nòu")
+      , (110, "cent dètz")
+      , (123, "cent vint-e-tres")
+      , (200, "dos cents")
+      , (300, "tres cents")
+      , (321, "tres cents vint-e-un")
+      , (400, "quatre cents")
+      , (500, "cinc cents")
+      , (600, "sièis cents")
+      , (700, "sèt cents")
+      , (800, "uèch cents")
+      , (900, "nòu cents")
+      , (909, "nòu cents nòu")
+      , (990, "nòu cents nonanta")
+      , (999, "nòu cents nonanta nòu")
+      , (1000, "mila")
+      , (1001, "mila un")
+      , (1008, "mila uèch")
+      , (1234, "mila dos cents trenta quatre")
+      , (2000, "dos mila")
+      , (3000, "tres mila")
+      , (4000, "quatre mila")
+      , (4321, "quatre mila tres cents vint-e-un")
+      , (5000, "cinc mila")
+      , (6000, "sièis mila")
+      , (7000, "sèt mila")
+      , (8000, "uèch mila")
+      , (9000, "nòu mila")
+      , (10000, "dètz mila")
+      , (12345, "dotze mila tres cents quaranta cinc")
+      , (20000, "vint mila")
+      , (30000, "trenta mila")
+      , (40000, "quaranta mila")
+      , (50000, "cinquanta mila")
+      , (54321, "cinquanta quatre mila tres cents vint-e-un")
+      , (60000, "seissanta mila")
+      , (70000, "setanta mila")
+      , (80000, "ochanta mila")
+      , (90000, "nonanta mila")
+      , (100000, "cent mila")
+      , (123456, "cent vint-e-tres mila quatre cents cinquanta sièis")
+      , (200000, "dos cents mila")
+      , (300000, "tres cents mila")
+      , (400000, "quatre cents mila")
+      , (500000, "cinc cents mila")
+      , (600000, "sièis cents mila")
+      , (654321, "sièis cents cinquanta quatre mila tres cents vint-e-un")
+      , (700000, "sèt cents mila")
+      , (800000, "uèch cents mila")
+      , (900000, "nòu cents mila")
+      , (1000000, "un milion")
+      , (1000001, "un milion un")
+      , (1234567, "un milion dos cents trenta quatre mila cinc cents seissanta sèt")
+      , (2000000, "dos milions")
+      , (3000000, "tres milions")
+      , (4000000, "quatre milions")
+      , (5000000, "cinc milions")
+      , (6000000, "sièis milions")
+      , (7000000, "sèt milions")
+      , (7654321, "sèt milions sièis cents cinquanta quatre mila tres cents vint-e-un")
+      , (8000000, "uèch milions")
+      , (9000000, "nòu milions")
+      , (1000000000, "un miliard")
+      , (1000000001, "un miliard un")
+      , (2000000000, "dos miliards")
+      , (3000000000, "tres miliards")
+      , (4000000000, "quatre miliards")
+      , (5000000000, "cinc miliards")
+      , (6000000000, "sièis miliards")
+      , (7000000000, "sèt miliards")
+      , (8000000000, "uèch miliards")
+      , (9000000000, "nòu miliards")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/OJ/TestData.hs b/src-test/Text/Numeral/Language/OJ/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/OJ/TestData.hs
+++ /dev/null
@@ -1,159 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        oj
-
-[@ISO639-2@]        oji
-
-[@ISO639-3@]        oji
-
-[@Native name@]     ᐊᓂᔑᓈᐯᒧᐎᓐ (Anishinaabemowin)
-
-[@English name@]    Ojibwe
--}
-
-module Text.Numeral.Language.OJ.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.sf.airnet.ne.jp/~ts/language/number/ojibwa.html
-  http://www.languagesandnumbers.com/how-to-count-in-ojibwa/en/oji/
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "kaagego")
-      , (1, "bezhik")
-      , (2, "niizh")
-      , (3, "nswi")
-      , (4, "niiwin")
-      , (5, "naanan")
-      , (6, "ngodwaaswi")
-      , (7, "niizhwaaswi")
-      , (8, "nshwaaswi")
-      , (9, "zhaangswi")
-      , (10, "mdaaswi")
-      , (11, "mdaaswi shaa bezhik")
-      , (12, "mdaaswi shaa niizh")
-      , (13, "mdaaswi shaa nswi")
-      , (14, "mdaaswi shaa niiwin")
-      , (15, "mdaaswi shaa naanan")
-      , (16, "mdaaswi shaa ngodwaaswi")
-      , (17, "mdaaswi shaa niizhwaaswi")
-      , (18, "mdaaswi shaa nshwaaswi")
-      , (19, "mdaaswi shaa zhaangswi")
-      , (20, "niizhtaana")
-      , (21, "niizhtaana shaa bezhik")
-      , (22, "niizhtaana shaa niizh")
-      , (23, "niizhtaana shaa nswi")
-      , (24, "niizhtaana shaa niiwin")
-      , (25, "niizhtaana shaa naanan")
-      , (26, "niizhtaana shaa ngodwaaswi")
-      , (27, "niizhtaana shaa niizhwaaswi")
-      , (28, "niizhtaana shaa nshwaaswi")
-      , (29, "niizhtaana shaa zhaangswi")
-      , (30, "nsimtaana")
-      , (31, "nsimtaana shaa bezhik")
-      , (32, "nsimtaana shaa niizh")
-      , (33, "nsimtaana shaa nswi")
-      , (34, "nsimtaana shaa niiwin")
-      , (35, "nsimtaana shaa naanan")
-      , (36, "nsimtaana shaa ngodwaaswi")
-      , (37, "nsimtaana shaa niizhwaaswi")
-      , (38, "nsimtaana shaa nshwaaswi")
-      , (39, "nsimtaana shaa zhaangswi")
-      , (40, "niimtaana")
-      , (41, "niimtaana shaa bezhik")
-      , (42, "niimtaana shaa niizh")
-      , (43, "niimtaana shaa nswi")
-      , (44, "niimtaana shaa niiwin")
-      , (45, "niimtaana shaa naanan")
-      , (46, "niimtaana shaa ngodwaaswi")
-      , (47, "niimtaana shaa niizhwaaswi")
-      , (48, "niimtaana shaa nshwaaswi")
-      , (49, "niimtaana shaa zhaangswi")
-      , (50, "naanmitaana")
-      , (51, "naanmitaana shaa bezhik")
-      , (52, "naanmitaana shaa niizh")
-      , (53, "naanmitaana shaa nswi")
-      , (54, "naanmitaana shaa niiwin")
-      , (55, "naanmitaana shaa naanan")
-      , (56, "naanmitaana shaa ngodwaaswi")
-      , (57, "naanmitaana shaa niizhwaaswi")
-      , (58, "naanmitaana shaa nshwaaswi")
-      , (59, "naanmitaana shaa zhaangswi")
-      , (60, "ngodwaasmitaana")
-      , (61, "ngodwaasmitaana shaa bezhik")
-      , (62, "ngodwaasmitaana shaa niizh")
-      , (63, "ngodwaasmitaana shaa nswi")
-      , (64, "ngodwaasmitaana shaa niiwin")
-      , (65, "ngodwaasmitaana shaa naanan")
-      , (66, "ngodwaasmitaana shaa ngodwaaswi")
-      , (67, "ngodwaasmitaana shaa niizhwaaswi")
-      , (68, "ngodwaasmitaana shaa nshwaaswi")
-      , (69, "ngodwaasmitaana shaa zhaangswi")
-      , (70, "niizhwaasmitaana")
-      , (71, "niizhwaasmitaana shaa bezhik")
-      , (72, "niizhwaasmitaana shaa niizh")
-      , (73, "niizhwaasmitaana shaa nswi")
-      , (74, "niizhwaasmitaana shaa niiwin")
-      , (75, "niizhwaasmitaana shaa naanan")
-      , (76, "niizhwaasmitaana shaa ngodwaaswi")
-      , (77, "niizhwaasmitaana shaa niizhwaaswi")
-      , (78, "niizhwaasmitaana shaa nshwaaswi")
-      , (79, "niizhwaasmitaana shaa zhaangswi")
-      , (80, "nshwaasmitaana")
-      , (81, "nshwaasmitaana shaa bezhik")
-      , (82, "nshwaasmitaana shaa niizh")
-      , (83, "nshwaasmitaana shaa nswi")
-      , (84, "nshwaasmitaana shaa niiwin")
-      , (85, "nshwaasmitaana shaa naanan")
-      , (86, "nshwaasmitaana shaa ngodwaaswi")
-      , (87, "nshwaasmitaana shaa niizhwaaswi")
-      , (88, "nshwaasmitaana shaa nshwaaswi")
-      , (89, "nshwaasmitaana shaa zhaangswi")
-      , (90, "zhaangsmitaana")
-      , (91, "zhaangsmitaana shaa bezhik")
-      , (92, "zhaangsmitaana shaa niizh")
-      , (93, "zhaangsmitaana shaa nswi")
-      , (94, "zhaangsmitaana shaa niiwin")
-      , (95, "zhaangsmitaana shaa naanan")
-      , (96, "zhaangsmitaana shaa ngodwaaswi")
-      , (97, "zhaangsmitaana shaa niizhwaaswi")
-      , (98, "zhaangsmitaana shaa nshwaaswi")
-      , (99, "zhaangsmitaana shaa zhaangswi")
-      , (100, "ngodwaak")
-      , (200, "niizhwaak")
-      , (300, "nswaak")
-      , (400, "niiwaak")
-      , (448, "niiwaak shaa niimtaana shaa nshwaaswi")
-      , (500, "naanwaak")
-      , (600, "ngodwaaswaak")
-      , (700, "niizhwaaswaak")
-      , (800, "nshwaaswaak")
-      , (900, "zhaangswaak")
-      , (1000, "mdaaswaak")
-      , (1222, "mdaaswaak shaa niizhwaak shaa niizhtaana shaa niizh")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/OJI/TestData.hs b/src-test/Text/Numeral/Language/OJI/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/OJI/TestData.hs
@@ -0,0 +1,170 @@
+{-|
+[@ISO639-1@]        oj
+
+[@ISO639-2@]        oji
+
+[@ISO639-3@]        oji
+
+[@Native name@]     ᐊᓂᔑᓈᐯᒧᐎᓐ (Anishinaabemowin)
+
+[@English name@]    Ojibwe
+-}
+
+module Text.Numeral.Language.OJI.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.sf.airnet.ne.jp/~ts/language/number/ojibwa.html
+  http://www.languagesandnumbers.com/how-to-count-in-ojibwa/en/oji/
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "kaagego")
+      , (1, "bezhik")
+      , (2, "niizh")
+      , (3, "nswi")
+      , (4, "niiwin")
+      , (5, "naanan")
+      , (6, "ngodwaaswi")
+      , (7, "niizhwaaswi")
+      , (8, "nshwaaswi")
+      , (9, "zhaangswi")
+      , (10, "mdaaswi")
+      , (11, "mdaaswi shaa bezhik")
+      , (12, "mdaaswi shaa niizh")
+      , (13, "mdaaswi shaa nswi")
+      , (14, "mdaaswi shaa niiwin")
+      , (15, "mdaaswi shaa naanan")
+      , (16, "mdaaswi shaa ngodwaaswi")
+      , (17, "mdaaswi shaa niizhwaaswi")
+      , (18, "mdaaswi shaa nshwaaswi")
+      , (19, "mdaaswi shaa zhaangswi")
+      , (20, "niizhtaana")
+      , (21, "niizhtaana shaa bezhik")
+      , (22, "niizhtaana shaa niizh")
+      , (23, "niizhtaana shaa nswi")
+      , (24, "niizhtaana shaa niiwin")
+      , (25, "niizhtaana shaa naanan")
+      , (26, "niizhtaana shaa ngodwaaswi")
+      , (27, "niizhtaana shaa niizhwaaswi")
+      , (28, "niizhtaana shaa nshwaaswi")
+      , (29, "niizhtaana shaa zhaangswi")
+      , (30, "nsimtaana")
+      , (31, "nsimtaana shaa bezhik")
+      , (32, "nsimtaana shaa niizh")
+      , (33, "nsimtaana shaa nswi")
+      , (34, "nsimtaana shaa niiwin")
+      , (35, "nsimtaana shaa naanan")
+      , (36, "nsimtaana shaa ngodwaaswi")
+      , (37, "nsimtaana shaa niizhwaaswi")
+      , (38, "nsimtaana shaa nshwaaswi")
+      , (39, "nsimtaana shaa zhaangswi")
+      , (40, "niimtaana")
+      , (41, "niimtaana shaa bezhik")
+      , (42, "niimtaana shaa niizh")
+      , (43, "niimtaana shaa nswi")
+      , (44, "niimtaana shaa niiwin")
+      , (45, "niimtaana shaa naanan")
+      , (46, "niimtaana shaa ngodwaaswi")
+      , (47, "niimtaana shaa niizhwaaswi")
+      , (48, "niimtaana shaa nshwaaswi")
+      , (49, "niimtaana shaa zhaangswi")
+      , (50, "naanmitaana")
+      , (51, "naanmitaana shaa bezhik")
+      , (52, "naanmitaana shaa niizh")
+      , (53, "naanmitaana shaa nswi")
+      , (54, "naanmitaana shaa niiwin")
+      , (55, "naanmitaana shaa naanan")
+      , (56, "naanmitaana shaa ngodwaaswi")
+      , (57, "naanmitaana shaa niizhwaaswi")
+      , (58, "naanmitaana shaa nshwaaswi")
+      , (59, "naanmitaana shaa zhaangswi")
+      , (60, "ngodwaasmitaana")
+      , (61, "ngodwaasmitaana shaa bezhik")
+      , (62, "ngodwaasmitaana shaa niizh")
+      , (63, "ngodwaasmitaana shaa nswi")
+      , (64, "ngodwaasmitaana shaa niiwin")
+      , (65, "ngodwaasmitaana shaa naanan")
+      , (66, "ngodwaasmitaana shaa ngodwaaswi")
+      , (67, "ngodwaasmitaana shaa niizhwaaswi")
+      , (68, "ngodwaasmitaana shaa nshwaaswi")
+      , (69, "ngodwaasmitaana shaa zhaangswi")
+      , (70, "niizhwaasmitaana")
+      , (71, "niizhwaasmitaana shaa bezhik")
+      , (72, "niizhwaasmitaana shaa niizh")
+      , (73, "niizhwaasmitaana shaa nswi")
+      , (74, "niizhwaasmitaana shaa niiwin")
+      , (75, "niizhwaasmitaana shaa naanan")
+      , (76, "niizhwaasmitaana shaa ngodwaaswi")
+      , (77, "niizhwaasmitaana shaa niizhwaaswi")
+      , (78, "niizhwaasmitaana shaa nshwaaswi")
+      , (79, "niizhwaasmitaana shaa zhaangswi")
+      , (80, "nshwaasmitaana")
+      , (81, "nshwaasmitaana shaa bezhik")
+      , (82, "nshwaasmitaana shaa niizh")
+      , (83, "nshwaasmitaana shaa nswi")
+      , (84, "nshwaasmitaana shaa niiwin")
+      , (85, "nshwaasmitaana shaa naanan")
+      , (86, "nshwaasmitaana shaa ngodwaaswi")
+      , (87, "nshwaasmitaana shaa niizhwaaswi")
+      , (88, "nshwaasmitaana shaa nshwaaswi")
+      , (89, "nshwaasmitaana shaa zhaangswi")
+      , (90, "zhaangsmitaana")
+      , (91, "zhaangsmitaana shaa bezhik")
+      , (92, "zhaangsmitaana shaa niizh")
+      , (93, "zhaangsmitaana shaa nswi")
+      , (94, "zhaangsmitaana shaa niiwin")
+      , (95, "zhaangsmitaana shaa naanan")
+      , (96, "zhaangsmitaana shaa ngodwaaswi")
+      , (97, "zhaangsmitaana shaa niizhwaaswi")
+      , (98, "zhaangsmitaana shaa nshwaaswi")
+      , (99, "zhaangsmitaana shaa zhaangswi")
+      , (100, "ngodwaak")
+      , (101, "ngodwaak shaa bezhik")
+      , (102, "ngodwaak shaa niizh")
+      , (103, "ngodwaak shaa nswi")
+      , (104, "ngodwaak shaa niiwin")
+      , (105, "ngodwaak shaa naanan")
+      , (106, "ngodwaak shaa ngodwaaswi")
+      , (107, "ngodwaak shaa niizhwaaswi")
+      , (108, "ngodwaak shaa nshwaaswi")
+      , (109, "ngodwaak shaa zhaangswi")
+      , (110, "ngodwaak shaa mdaaswi")
+      , (123, "ngodwaak shaa niizhtaana shaa nswi")
+      , (200, "niizhwaak")
+      , (300, "nswaak")
+      , (321, "nswaak shaa niizhtaana shaa bezhik")
+      , (400, "niiwaak")
+      , (448, "niiwaak shaa niimtaana shaa nshwaaswi")
+      , (500, "naanwaak")
+      , (600, "ngodwaaswaak")
+      , (700, "niizhwaaswaak")
+      , (800, "nshwaaswaak")
+      , (900, "zhaangswaak")
+      , (909, "zhaangswaak shaa zhaangswi")
+      , (990, "zhaangswaak shaa zhaangsmitaana")
+      , (999, "zhaangswaak shaa zhaangsmitaana shaa zhaangswi")
+      , (1000, "mdaaswaak")
+      , (1001, "mdaaswaak shaa bezhik")
+      , (1008, "mdaaswaak shaa nshwaaswi")
+      , (1222, "mdaaswaak shaa niizhwaak shaa niizhtaana shaa niizh")
+      , (1234, "mdaaswaak shaa niizhwaak shaa nsimtaana shaa niiwin")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/ONE/TestData.hs b/src-test/Text/Numeral/Language/ONE/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/ONE/TestData.hs
@@ -0,0 +1,162 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        one
+
+[@Native name@]     Onʌyotaʔa:ka
+
+[@English name@]    Oneida
+-}
+module Text.Numeral.Language.ONE.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-oneida/en/one/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "úskah")
+      , (2, "téken")
+      , (3, "áhsʌ")
+      , (4, "kayé")
+      , (5, "wisk")
+      , (6, "yá·yahk")
+      , (7, "tsya·ták")
+      , (8, "tékluˀ")
+      , (9, "wá·tlu")
+      , (10, "oye·lí")
+      , (11, "úskah yawʌ·lé")
+      , (12, "tékni yawʌ·lé")
+      , (13, "áhsʌ yawʌ·lé")
+      , (14, "kayé yawʌ·lé")
+      , (15, "wisk yawʌ·lé")
+      , (16, "yá·yahk yawʌ·lé")
+      , (17, "tsya·ták yawʌ·lé")
+      , (18, "tékluˀ yawʌ·lé")
+      , (19, "wá·tlu yawʌ·lé")
+      , (20, "tewáshʌ")
+      , (21, "tewáshʌ úskah")
+      , (22, "tewáshʌ téken")
+      , (23, "tewáshʌ áhsʌ")
+      , (24, "tewáshʌ kayé")
+      , (25, "tewáshʌ wisk")
+      , (26, "tewáshʌ yá·yahk")
+      , (27, "tewáshʌ tsya·ták")
+      , (28, "tewáshʌ tékluˀ")
+      , (29, "tewáshʌ wá·tlu")
+      , (30, "áhsʌ niwáshʌ")
+      , (31, "áhsʌ niwáshʌ úskah")
+      , (32, "áhsʌ niwáshʌ téken")
+      , (33, "áhsʌ niwáshʌ áhsʌ")
+      , (34, "áhsʌ niwáshʌ kayé")
+      , (35, "áhsʌ niwáshʌ wisk")
+      , (36, "áhsʌ niwáshʌ yá·yahk")
+      , (37, "áhsʌ niwáshʌ tsya·ták")
+      , (38, "áhsʌ niwáshʌ tékluˀ")
+      , (39, "áhsʌ niwáshʌ wá·tlu")
+      , (40, "kayé niwáshʌ")
+      , (41, "kayé niwáshʌ úskah")
+      , (42, "kayé niwáshʌ téken")
+      , (43, "kayé niwáshʌ áhsʌ")
+      , (44, "kayé niwáshʌ kayé")
+      , (45, "kayé niwáshʌ wisk")
+      , (46, "kayé niwáshʌ yá·yahk")
+      , (47, "kayé niwáshʌ tsya·ták")
+      , (48, "kayé niwáshʌ tékluˀ")
+      , (49, "kayé niwáshʌ wá·tlu")
+      , (50, "wisk niwáshʌ")
+      , (51, "wisk niwáshʌ úskah")
+      , (52, "wisk niwáshʌ téken")
+      , (53, "wisk niwáshʌ áhsʌ")
+      , (54, "wisk niwáshʌ kayé")
+      , (55, "wisk niwáshʌ wisk")
+      , (56, "wisk niwáshʌ yá·yahk")
+      , (57, "wisk niwáshʌ tsya·ták")
+      , (58, "wisk niwáshʌ tékluˀ")
+      , (59, "wisk niwáshʌ wá·tlu")
+      , (60, "yá·yahk niwáshʌ")
+      , (61, "yá·yahk niwáshʌ úskah")
+      , (62, "yá·yahk niwáshʌ téken")
+      , (63, "yá·yahk niwáshʌ áhsʌ")
+      , (64, "yá·yahk niwáshʌ kayé")
+      , (65, "yá·yahk niwáshʌ wisk")
+      , (66, "yá·yahk niwáshʌ yá·yahk")
+      , (67, "yá·yahk niwáshʌ tsya·ták")
+      , (68, "yá·yahk niwáshʌ tékluˀ")
+      , (69, "yá·yahk niwáshʌ wá·tlu")
+      , (70, "tsya·ták niwáshʌ")
+      , (71, "tsya·ták niwáshʌ úskah")
+      , (72, "tsya·ták niwáshʌ téken")
+      , (73, "tsya·ták niwáshʌ áhsʌ")
+      , (74, "tsya·ták niwáshʌ kayé")
+      , (75, "tsya·ták niwáshʌ wisk")
+      , (76, "tsya·ták niwáshʌ yá·yahk")
+      , (77, "tsya·ták niwáshʌ tsya·ták")
+      , (78, "tsya·ták niwáshʌ tékluˀ")
+      , (79, "tsya·ták niwáshʌ wá·tlu")
+      , (80, "tékluˀ niwáshʌ")
+      , (81, "tékluˀ niwáshʌ úskah")
+      , (82, "tékluˀ niwáshʌ téken")
+      , (83, "tékluˀ niwáshʌ áhsʌ")
+      , (84, "tékluˀ niwáshʌ kayé")
+      , (85, "tékluˀ niwáshʌ wisk")
+      , (86, "tékluˀ niwáshʌ yá·yahk")
+      , (87, "tékluˀ niwáshʌ tsya·ták")
+      , (88, "tékluˀ niwáshʌ tékluˀ")
+      , (89, "tékluˀ niwáshʌ wá·tlu")
+      , (90, "wá·tlu niwáshʌ")
+      , (91, "wá·tlu niwáshʌ úskah")
+      , (92, "wá·tlu niwáshʌ téken")
+      , (93, "wá·tlu niwáshʌ áhsʌ")
+      , (94, "wá·tlu niwáshʌ kayé")
+      , (95, "wá·tlu niwáshʌ wisk")
+      , (96, "wá·tlu niwáshʌ yá·yahk")
+      , (97, "wá·tlu niwáshʌ tsya·ták")
+      , (98, "wá·tlu niwáshʌ tékluˀ")
+      , (99, "wá·tlu niwáshʌ wá·tlu")
+      , (100, "tewʌˀnyáwelu")
+      , (101, "tewʌˀnyáwelu ok úskah")
+      , (102, "tewʌˀnyáwelu ok téken")
+      , (103, "tewʌˀnyáwelu ok áhsʌ")
+      , (104, "tewʌˀnyáwelu ok kayé")
+      , (105, "tewʌˀnyáwelu ok wisk")
+      , (106, "tewʌˀnyáwelu ok yá·yahk")
+      , (107, "tewʌˀnyáwelu ok tsya·ták")
+      , (108, "tewʌˀnyáwelu ok tékluˀ")
+      , (109, "tewʌˀnyáwelu ok wá·tlu")
+      , (110, "tewʌˀnyáwelu ok oye·lí")
+      , (123, "tewʌˀnyáwelu ok tewáshʌ áhsʌ")
+      , (200, "tékni tewʌˀnyáwelu")
+      , (300, "áhsʌ tewʌˀnyáwelu")
+      , (321, "áhsʌ tewʌˀnyáwelu ok tewáshʌ úskah")
+      , (400, "kayé tewʌˀnyáwelu")
+      , (500, "wisk tewʌˀnyáwelu")
+      , (600, "yá·yahk tewʌˀnyáwelu")
+      , (700, "tsya·ták tewʌˀnyáwelu")
+      , (800, "tékluˀ tewʌˀnyáwelu")
+      , (900, "wá·tlu tewʌˀnyáwelu")
+      , (909, "wá·tlu tewʌˀnyáwelu ok wá·tlu")
+      , (990, "wá·tlu tewʌˀnyáwelu ok wá·tlu niwáshʌ")
+      , (999, "wá·tlu tewʌˀnyáwelu ok wá·tlu niwáshʌ wá·tlu")
+      , (1000, "skanutó·tslat")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/ORM/TestData.hs b/src-test/Text/Numeral/Language/ORM/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/ORM/TestData.hs
@@ -0,0 +1,175 @@
+{-|
+[@ISO639-1@]        om
+
+[@ISO639-2@]        orm
+
+[@ISO639-3@]        orm
+
+[@Native name@]     Afaan Oromo
+
+[@English name@]    Oromo
+-}
+module Text.Numeral.Language.ORM.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-oromo/en/orm/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "duwwa")
+      , (1, "tokko")
+      , (2, "lama")
+      , (3, "sadi")
+      , (4, "afur")
+      , (5, "shan")
+      , (6, "jaya")
+      , (7, "torba")
+      , (8, "saddeet")
+      , (9, "sagal")
+      , (10, "khudan")
+      , (11, "khuda-tokko")
+      , (12, "khuda-lama")
+      , (13, "khuda-sadi")
+      , (14, "khuda-afur")
+      , (15, "khuda-shan")
+      , (16, "khuda-jaya")
+      , (17, "khuda-torba")
+      , (18, "khuda-saddeet")
+      , (19, "khuda-sagal")
+      , (20, "digdama")
+      , (21, "digdamii-tokko")
+      , (22, "digdamii-lama")
+      , (23, "digdamii-sadi")
+      , (24, "digdamii-afur")
+      , (25, "digdamii-shan")
+      , (26, "digdamii-jaya")
+      , (27, "digdamii-torba")
+      , (28, "digdamii-saddeet")
+      , (29, "digdamii-sagal")
+      , (30, "soddoma")
+      , (31, "soddomii-tokko")
+      , (32, "soddomii-lama")
+      , (33, "soddomii-sadi")
+      , (34, "soddomii-afur")
+      , (35, "soddomii-shan")
+      , (36, "soddomii-jaya")
+      , (37, "soddomii-torba")
+      , (38, "soddomii-saddeet")
+      , (39, "soddomii-sagal")
+      , (40, "afurtama")
+      , (41, "afurtamii-tokko")
+      , (42, "afurtamii-lama")
+      , (43, "afurtamii-sadi")
+      , (44, "afurtamii-afur")
+      , (45, "afurtamii-shan")
+      , (46, "afurtamii-jaya")
+      , (47, "afurtamii-torba")
+      , (48, "afurtamii-saddeet")
+      , (49, "afurtamii-sagal")
+      , (50, "shantama")
+      , (51, "shantamii-tokko")
+      , (52, "shantamii-lama")
+      , (53, "shantamii-sadi")
+      , (54, "shantamii-afur")
+      , (55, "shantamii-shan")
+      , (56, "shantamii-jaya")
+      , (57, "shantamii-torba")
+      , (58, "shantamii-saddeet")
+      , (59, "shantamii-sagal")
+      , (60, "jaatama")
+      , (61, "jaatamii-tokko")
+      , (62, "jaatamii-lama")
+      , (63, "jaatamii-sadi")
+      , (64, "jaatamii-afur")
+      , (65, "jaatamii-shan")
+      , (66, "jaatamii-jaya")
+      , (67, "jaatamii-torba")
+      , (68, "jaatamii-saddeet")
+      , (69, "jaatamii-sagal")
+      , (70, "torbatama")
+      , (71, "torbatamii-tokko")
+      , (72, "torbatamii-lama")
+      , (73, "torbatamii-sadi")
+      , (74, "torbatamii-afur")
+      , (75, "torbatamii-shan")
+      , (76, "torbatamii-jaya")
+      , (77, "torbatamii-torba")
+      , (78, "torbatamii-saddeet")
+      , (79, "torbatamii-sagal")
+      , (80, "saddeetama")
+      , (81, "saddeetamii-tokko")
+      , (82, "saddeetamii-lama")
+      , (83, "saddeetamii-sadi")
+      , (84, "saddeetamii-afur")
+      , (85, "saddeetamii-shan")
+      , (86, "saddeetamii-jaya")
+      , (87, "saddeetamii-torba")
+      , (88, "saddeetamii-saddeet")
+      , (89, "saddeetamii-sagal")
+      , (90, "sagaltama")
+      , (91, "sagaltamii-tokko")
+      , (92, "sagaltamii-lama")
+      , (93, "sagaltamii-sadi")
+      , (94, "sagaltamii-afur")
+      , (95, "sagaltamii-shan")
+      , (96, "sagaltamii-jaya")
+      , (97, "sagaltamii-torba")
+      , (98, "sagaltamii-saddeet")
+      , (99, "sagaltamii-sagal")
+      , (100, "dhibba")
+      , (101, "dhibba tokko")
+      , (102, "dhibba lama")
+      , (103, "dhibba sadi")
+      , (104, "dhibba afur")
+      , (105, "dhibba shan")
+      , (106, "dhibba jaya")
+      , (107, "dhibba torba")
+      , (108, "dhibba saddeet")
+      , (109, "dhibba sagal")
+      , (110, "dhibba khudan")
+      , (123, "dhibba digdamii-sadi")
+      , (200, "lama dhibba")
+      , (300, "sadi dhibba")
+      , (321, "sadi dhibba digdamii-tokko")
+      , (400, "afur dhibba")
+      , (500, "shan dhibba")
+      , (600, "jaya dhibba")
+      , (700, "torba dhibba")
+      , (800, "saddeet dhibba")
+      , (900, "sagal dhibba")
+      , (909, "sagal dhibba sagal")
+      , (990, "sagal dhibba sagaltama")
+      , (999, "sagal dhibba sagaltamii-sagal")
+      , (1000, "kuma")
+      , (1001, "kuma tokko")
+      , (1008, "kuma saddeet")
+      , (1234, "kuma lama dhibba soddomii-afur")
+      , (2000, "lama kuma")
+      , (3000, "sadi kuma")
+      , (4000, "afur kuma")
+      , (4321, "afur kuma sadi dhibba digdamii-tokko")
+      , (5000, "shan kuma")
+      , (6000, "jaya kuma")
+      , (7000, "torba kuma")
+      , (8000, "saddeet kuma")
+      , (9000, "sagal kuma")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/PAA/TestData.hs b/src-test/Text/Numeral/Language/PAA/TestData.hs
--- a/src-test/Text/Numeral/Language/PAA/TestData.hs
+++ b/src-test/Text/Numeral/Language/PAA/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -22,8 +17,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -31,7 +25,7 @@
 -- Test data
 --------------------------------------------------------------------------------
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/PDC/TestData.hs b/src-test/Text/Numeral/Language/PDC/TestData.hs
--- a/src-test/Text/Numeral/Language/PDC/TestData.hs
+++ b/src-test/Text/Numeral/Language/PDC/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-3@]        pdc
 
@@ -17,9 +12,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "numerals" Text.Numeral.Misc ( dec )
 import "this" Text.Numeral.Test ( TestData )
 
@@ -32,7 +25,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-pennsylvania-german/en/pdc/
 -}
 
-cardinals ∷ (Integral i) ⇒ TestData i
+cardinals :: (Integral i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
@@ -163,7 +156,7 @@
       , (524288, "fimf hunnert vierunzwansich dausend zwee hunnert achtunachtzich")
       , (dec 6, "en millyon")
       , (1048576, "en millyon achtunvazich dausend fimf hunnert sexunsiwwezich")
-      , (5 ⋅ dec 6, "fimf millyon")
+      , (5 * dec 6, "fimf millyon")
       , (123456789, "en hunnert dreiunzwansich millyon vier hunnert sexunfuffzich dausend siwwe hunnert neinunachtzich")
       ]
     )
diff --git a/src-test/Text/Numeral/Language/PL/TestData.hs b/src-test/Text/Numeral/Language/PL/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/PL/TestData.hs
+++ /dev/null
@@ -1,204 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        pl
-
-[@ISO639-2@]        pol
-
-[@ISO639-3@]        pol
-
-[@Native name@]     język polski
-
-[@English name@]    Polish
--}
-
-module Text.Numeral.Language.PL.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
--- Sources:
---   Krzysztof Skrzętnicki
---   http://www.polishforums.com/archives/2009/general-language-17/numbers-polish-language-6722/
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "zero")
-      , (1, "jeden")
-      , (2, "dwa")
-      , (3, "trzy")
-      , (4, "cztery")
-      , (5, "pięć")
-      , (6, "sześć")
-      , (7, "siedem")
-      , (8, "osiem")
-      , (9, "dziewięć")
-      , (10, "dziesięć")
-      , (11, "jedenaście")
-      , (12, "dwanaście")
-      , (13, "trzynaście")
-      , (14, "czternaście")
-      , (15, "piętnaście")
-      , (16, "szesnaście")
-      , (17, "siedemnaście")
-      , (18, "osiemnaście")
-      , (19, "dziewiętnaście")
-      , (20, "dwadzieścia")
-      , (21, "dwadzieścia jeden")
-      , (22, "dwadzieścia dwa")
-      , (23, "dwadzieścia trzy")
-      , (24, "dwadzieścia cztery")
-      , (25, "dwadzieścia pięć")
-      , (26, "dwadzieścia sześć")
-      , (27, "dwadzieścia siedem")
-      , (28, "dwadzieścia osiem")
-      , (29, "dwadzieścia dziewięć")
-      , (30, "trzydzieści")
-      , (31, "trzydzieści jeden")
-      , (32, "trzydzieści dwa")
-      , (33, "trzydzieści trzy")
-      , (34, "trzydzieści cztery")
-      , (35, "trzydzieści pięć")
-      , (36, "trzydzieści sześć")
-      , (37, "trzydzieści siedem")
-      , (38, "trzydzieści osiem")
-      , (39, "trzydzieści dziewięć")
-      , (40, "czterdzieści")
-      , (41, "czterdzieści jeden")
-      , (42, "czterdzieści dwa")
-      , (43, "czterdzieści trzy")
-      , (44, "czterdzieści cztery")
-      , (45, "czterdzieści pięć")
-      , (46, "czterdzieści sześć")
-      , (47, "czterdzieści siedem")
-      , (48, "czterdzieści osiem")
-      , (49, "czterdzieści dziewięć")
-      , (50, "pięćdziesiąt")
-      , (51, "pięćdziesiąt jeden")
-      , (52, "pięćdziesiąt dwa")
-      , (53, "pięćdziesiąt trzy")
-      , (54, "pięćdziesiąt cztery")
-      , (55, "pięćdziesiąt pięć")
-      , (56, "pięćdziesiąt sześć")
-      , (57, "pięćdziesiąt siedem")
-      , (58, "pięćdziesiąt osiem")
-      , (59, "pięćdziesiąt dziewięć")
-      , (60, "sześćdziesiąt")
-      , (61, "sześćdziesiąt jeden")
-      , (62, "sześćdziesiąt dwa")
-      , (63, "sześćdziesiąt trzy")
-      , (64, "sześćdziesiąt cztery")
-      , (65, "sześćdziesiąt pięć")
-      , (66, "sześćdziesiąt sześć")
-      , (67, "sześćdziesiąt siedem")
-      , (68, "sześćdziesiąt osiem")
-      , (69, "sześćdziesiąt dziewięć")
-      , (70, "siedemdziesiąt")
-      , (71, "siedemdziesiąt jeden")
-      , (72, "siedemdziesiąt dwa")
-      , (73, "siedemdziesiąt trzy")
-      , (74, "siedemdziesiąt cztery")
-      , (75, "siedemdziesiąt pięć")
-      , (76, "siedemdziesiąt sześć")
-      , (77, "siedemdziesiąt siedem")
-      , (78, "siedemdziesiąt osiem")
-      , (79, "siedemdziesiąt dziewięć")
-      , (80, "osiemdziesiąt")
-      , (81, "osiemdziesiąt jeden")
-      , (82, "osiemdziesiąt dwa")
-      , (83, "osiemdziesiąt trzy")
-      , (84, "osiemdziesiąt cztery")
-      , (85, "osiemdziesiąt pięć")
-      , (86, "osiemdziesiąt sześć")
-      , (87, "osiemdziesiąt siedem")
-      , (88, "osiemdziesiąt osiem")
-      , (89, "osiemdziesiąt dziewięć")
-      , (90, "dziewięćdziesiąt")
-      , (91, "dziewięćdziesiąt jeden")
-      , (92, "dziewięćdziesiąt dwa")
-      , (93, "dziewięćdziesiąt trzy")
-      , (94, "dziewięćdziesiąt cztery")
-      , (95, "dziewięćdziesiąt pięć")
-      , (96, "dziewięćdziesiąt sześć")
-      , (97, "dziewięćdziesiąt siedem")
-      , (98, "dziewięćdziesiąt osiem")
-      , (99, "dziewięćdziesiąt dziewięć")
-      , (100, "sto")
-      , (101, "sto jeden")
-      , (110, "sto dziesięć")
-      , (111, "sto jedenaście")
-      , (120, "sto dwadzieścia")
-      , (121, "sto dwadzieścia jeden")
-      , (144, "sto czterdzieści cztery")
-      , (200, "dwieście")
-      , (300, "trzysta")
-      , (400, "czterysta")
-      , (500, "pięćset")
-      , (600, "sześćset")
-      , (700, "siedemset")
-      , (777, "siedemset siedemdziesiąt siedem")
-      , (800, "osiemset")
-      , (900, "dziewięćset")
-      , (1000, "tysiąc")
-      , (1001, "tysiąc jeden")
-      , (1010, "tysiąc dziesięć")
-      , (1011, "tysiąc jedenaście")
-      , (1024, "tysiąc dwadzieścia cztery")
-      , (1100, "tysiąc sto")
-      , (1728, "tysiąc siedemset dwadzieścia osiem")
-      , (2000, "dwa tysiące")
-      , (3000, "trzy tysiące")
-      , (4000, "cztery tysiące")
-      , (5000, "pięć tysięcy")
-      , (6000, "sześć tysięcy")
-      , (7000, "siedem tysięcy")
-      , (8000, "osiem tysięcy")
-      , (9000, "dziewięć tysięcy")
-      , (10000, "dziesięć tysięcy")
-      , (100000, "sto tysięcy")
-      , (500000, "pięćset tysięcy")
-      , (1000000, "milion")
-      , (1048576, "milion czterdzieści osiem tysięcy pięćset siedemdziesiąt sześć")
-      , (2 ⋅ dec 6, "dwa miliony")
-      , (3 ⋅ dec 6, "trzy miliony")
-      , (4 ⋅ dec 6, "cztery miliony")
-      , (5 ⋅ dec 6, "pięć milionów")
-      , (6 ⋅ dec 6, "sześć milionów")
-      , (7 ⋅ dec 6, "siedem milionów")
-      , (8 ⋅ dec 6, "osiem milionów")
-      , (9 ⋅ dec 6, "dziewięć milionów")
-      , (dec 7, "dziesięć milionów")
-      , (dec 8, "sto milionów")
-      , (dec 9, "miliard")
-      , (2 ⋅ dec 9, "dwa miliardy")
-      , (3 ⋅ dec 9, "trzy miliardy")
-      , (4 ⋅ dec 9, "cztery miliardy")
-      , (5 ⋅ dec 9, "pięć miliardów")
-      , (6 ⋅ dec 9, "sześć miliardów")
-      , (7 ⋅ dec 9, "siedem miliardów")
-      , (8 ⋅ dec 9, "osiem miliardów")
-      , (9 ⋅ dec 9, "dziewięć miliardów")
-      , (dec 10, "dziesięć miliardów")
-      , (dec 11, "sto miliardów")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/POL/TestData.hs b/src-test/Text/Numeral/Language/POL/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/POL/TestData.hs
@@ -0,0 +1,196 @@
+{-|
+[@ISO639-1@]        pl
+
+[@ISO639-2@]        pol
+
+[@ISO639-3@]        pol
+
+[@Native name@]     język polski
+
+[@English name@]    Polish
+-}
+
+module Text.Numeral.Language.POL.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+-- Sources:
+--   Krzysztof Skrzętnicki
+--   http://www.polishforums.com/archives/2009/general-language-17/numbers-polish-language-6722/
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "zero")
+      , (1, "jeden")
+      , (2, "dwa")
+      , (3, "trzy")
+      , (4, "cztery")
+      , (5, "pięć")
+      , (6, "sześć")
+      , (7, "siedem")
+      , (8, "osiem")
+      , (9, "dziewięć")
+      , (10, "dziesięć")
+      , (11, "jedenaście")
+      , (12, "dwanaście")
+      , (13, "trzynaście")
+      , (14, "czternaście")
+      , (15, "piętnaście")
+      , (16, "szesnaście")
+      , (17, "siedemnaście")
+      , (18, "osiemnaście")
+      , (19, "dziewiętnaście")
+      , (20, "dwadzieścia")
+      , (21, "dwadzieścia jeden")
+      , (22, "dwadzieścia dwa")
+      , (23, "dwadzieścia trzy")
+      , (24, "dwadzieścia cztery")
+      , (25, "dwadzieścia pięć")
+      , (26, "dwadzieścia sześć")
+      , (27, "dwadzieścia siedem")
+      , (28, "dwadzieścia osiem")
+      , (29, "dwadzieścia dziewięć")
+      , (30, "trzydzieści")
+      , (31, "trzydzieści jeden")
+      , (32, "trzydzieści dwa")
+      , (33, "trzydzieści trzy")
+      , (34, "trzydzieści cztery")
+      , (35, "trzydzieści pięć")
+      , (36, "trzydzieści sześć")
+      , (37, "trzydzieści siedem")
+      , (38, "trzydzieści osiem")
+      , (39, "trzydzieści dziewięć")
+      , (40, "czterdzieści")
+      , (41, "czterdzieści jeden")
+      , (42, "czterdzieści dwa")
+      , (43, "czterdzieści trzy")
+      , (44, "czterdzieści cztery")
+      , (45, "czterdzieści pięć")
+      , (46, "czterdzieści sześć")
+      , (47, "czterdzieści siedem")
+      , (48, "czterdzieści osiem")
+      , (49, "czterdzieści dziewięć")
+      , (50, "pięćdziesiąt")
+      , (51, "pięćdziesiąt jeden")
+      , (52, "pięćdziesiąt dwa")
+      , (53, "pięćdziesiąt trzy")
+      , (54, "pięćdziesiąt cztery")
+      , (55, "pięćdziesiąt pięć")
+      , (56, "pięćdziesiąt sześć")
+      , (57, "pięćdziesiąt siedem")
+      , (58, "pięćdziesiąt osiem")
+      , (59, "pięćdziesiąt dziewięć")
+      , (60, "sześćdziesiąt")
+      , (61, "sześćdziesiąt jeden")
+      , (62, "sześćdziesiąt dwa")
+      , (63, "sześćdziesiąt trzy")
+      , (64, "sześćdziesiąt cztery")
+      , (65, "sześćdziesiąt pięć")
+      , (66, "sześćdziesiąt sześć")
+      , (67, "sześćdziesiąt siedem")
+      , (68, "sześćdziesiąt osiem")
+      , (69, "sześćdziesiąt dziewięć")
+      , (70, "siedemdziesiąt")
+      , (71, "siedemdziesiąt jeden")
+      , (72, "siedemdziesiąt dwa")
+      , (73, "siedemdziesiąt trzy")
+      , (74, "siedemdziesiąt cztery")
+      , (75, "siedemdziesiąt pięć")
+      , (76, "siedemdziesiąt sześć")
+      , (77, "siedemdziesiąt siedem")
+      , (78, "siedemdziesiąt osiem")
+      , (79, "siedemdziesiąt dziewięć")
+      , (80, "osiemdziesiąt")
+      , (81, "osiemdziesiąt jeden")
+      , (82, "osiemdziesiąt dwa")
+      , (83, "osiemdziesiąt trzy")
+      , (84, "osiemdziesiąt cztery")
+      , (85, "osiemdziesiąt pięć")
+      , (86, "osiemdziesiąt sześć")
+      , (87, "osiemdziesiąt siedem")
+      , (88, "osiemdziesiąt osiem")
+      , (89, "osiemdziesiąt dziewięć")
+      , (90, "dziewięćdziesiąt")
+      , (91, "dziewięćdziesiąt jeden")
+      , (92, "dziewięćdziesiąt dwa")
+      , (93, "dziewięćdziesiąt trzy")
+      , (94, "dziewięćdziesiąt cztery")
+      , (95, "dziewięćdziesiąt pięć")
+      , (96, "dziewięćdziesiąt sześć")
+      , (97, "dziewięćdziesiąt siedem")
+      , (98, "dziewięćdziesiąt osiem")
+      , (99, "dziewięćdziesiąt dziewięć")
+      , (100, "sto")
+      , (101, "sto jeden")
+      , (110, "sto dziesięć")
+      , (111, "sto jedenaście")
+      , (120, "sto dwadzieścia")
+      , (121, "sto dwadzieścia jeden")
+      , (144, "sto czterdzieści cztery")
+      , (200, "dwieście")
+      , (300, "trzysta")
+      , (400, "czterysta")
+      , (500, "pięćset")
+      , (600, "sześćset")
+      , (700, "siedemset")
+      , (777, "siedemset siedemdziesiąt siedem")
+      , (800, "osiemset")
+      , (900, "dziewięćset")
+      , (1000, "tysiąc")
+      , (1001, "tysiąc jeden")
+      , (1010, "tysiąc dziesięć")
+      , (1011, "tysiąc jedenaście")
+      , (1024, "tysiąc dwadzieścia cztery")
+      , (1100, "tysiąc sto")
+      , (1728, "tysiąc siedemset dwadzieścia osiem")
+      , (2000, "dwa tysiące")
+      , (3000, "trzy tysiące")
+      , (4000, "cztery tysiące")
+      , (5000, "pięć tysięcy")
+      , (6000, "sześć tysięcy")
+      , (7000, "siedem tysięcy")
+      , (8000, "osiem tysięcy")
+      , (9000, "dziewięć tysięcy")
+      , (10000, "dziesięć tysięcy")
+      , (100000, "sto tysięcy")
+      , (500000, "pięćset tysięcy")
+      , (1000000, "milion")
+      , (1048576, "milion czterdzieści osiem tysięcy pięćset siedemdziesiąt sześć")
+      , (2 * dec 6, "dwa miliony")
+      , (3 * dec 6, "trzy miliony")
+      , (4 * dec 6, "cztery miliony")
+      , (5 * dec 6, "pięć milionów")
+      , (6 * dec 6, "sześć milionów")
+      , (7 * dec 6, "siedem milionów")
+      , (8 * dec 6, "osiem milionów")
+      , (9 * dec 6, "dziewięć milionów")
+      , (dec 7, "dziesięć milionów")
+      , (dec 8, "sto milionów")
+      , (dec 9, "miliard")
+      , (2 * dec 9, "dwa miliardy")
+      , (3 * dec 9, "trzy miliardy")
+      , (4 * dec 9, "cztery miliardy")
+      , (5 * dec 9, "pięć miliardów")
+      , (6 * dec 9, "sześć miliardów")
+      , (7 * dec 9, "siedem miliardów")
+      , (8 * dec 9, "osiem miliardów")
+      , (9 * dec 9, "dziewięć miliardów")
+      , (dec 10, "dziesięć miliardów")
+      , (dec 11, "sto miliardów")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/POR/TestData.hs b/src-test/Text/Numeral/Language/POR/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/POR/TestData.hs
@@ -0,0 +1,291 @@
+{-|
+[@ISO639-1@]        pt
+
+[@ISO639-2@]        por
+
+[@ISO639-3@]        por
+
+[@Native name@]     Português
+
+[@English name@]    Portuguese
+-}
+
+module Text.Numeral.Language.POR.TestData (cardinals, ordinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Control.Arrow ( second )
+import "base" Data.Monoid ( (<>) )
+import "numerals" Text.Numeral.Grammar
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+-- Sources:
+--   http://www.sonia-portuguese.com/text/numerals.htm
+--   http://www.smartphrase.com/Portuguese/po_numbers_voc.shtml
+
+base_cardinals :: (Integral i) => [(i, Text)]
+base_cardinals =
+  [ (0, "zero")
+  , (3, "três")
+  , (4, "quatro")
+  , (5, "cinco")
+  , (6, "seis")
+  , (7, "sete")
+  , (8, "oito")
+  , (9, "nove")
+  , (10, "dez")
+  , (11, "onze")
+  , (12, "doze")
+  , (13, "treze")
+  , (14, "catorze")
+  , (15, "quinze")
+  , (16, "dezasseis")
+  , (17, "dezassete")
+  , (18, "dezoito")
+  , (19, "dezanove")
+  , (20, "vinte")
+  , (23, "vinte e três")
+  , (24, "vinte e quatro")
+  , (25, "vinte e cinco")
+  , (26, "vinte e seis")
+  , (27, "vinte e sete")
+  , (28, "vinte e oito")
+  , (29, "vinte e nove")
+  , (30, "trinta")
+  , (33, "trinta e três")
+  , (34, "trinta e quatro")
+  , (35, "trinta e cinco")
+  , (36, "trinta e seis")
+  , (37, "trinta e sete")
+  , (38, "trinta e oito")
+  , (39, "trinta e nove")
+  , (40, "quarenta")
+  , (43, "quarenta e três")
+  , (44, "quarenta e quatro")
+  , (45, "quarenta e cinco")
+  , (46, "quarenta e seis")
+  , (47, "quarenta e sete")
+  , (48, "quarenta e oito")
+  , (49, "quarenta e nove")
+  , (50, "cinquenta")
+  , (53, "cinquenta e três")
+  , (54, "cinquenta e quatro")
+  , (55, "cinquenta e cinco")
+  , (56, "cinquenta e seis")
+  , (57, "cinquenta e sete")
+  , (58, "cinquenta e oito")
+  , (59, "cinquenta e nove")
+  , (60, "sessenta")
+  , (63, "sessenta e três")
+  , (64, "sessenta e quatro")
+  , (65, "sessenta e cinco")
+  , (66, "sessenta e seis")
+  , (67, "sessenta e sete")
+  , (68, "sessenta e oito")
+  , (69, "sessenta e nove")
+  , (70, "setenta")
+  , (73, "setenta e três")
+  , (74, "setenta e quatro")
+  , (75, "setenta e cinco")
+  , (76, "setenta e seis")
+  , (77, "setenta e sete")
+  , (78, "setenta e oito")
+  , (79, "setenta e nove")
+  , (80, "oitenta")
+  , (83, "oitenta e três")
+  , (84, "oitenta e quatro")
+  , (85, "oitenta e cinco")
+  , (86, "oitenta e seis")
+  , (87, "oitenta e sete")
+  , (88, "oitenta e oito")
+  , (89, "oitenta e nove")
+  , (90, "noventa")
+  , (93, "noventa e três")
+  , (94, "noventa e quatro")
+  , (95, "noventa e cinco")
+  , (96, "noventa e seis")
+  , (97, "noventa e sete")
+  , (98, "noventa e oito")
+  , (99, "noventa e nove")
+  , (100, "cem")
+  , (105, "cento e cinco")
+  , (125, "cento e vinte e cinco")
+  , (138, "cento e trinta e oito")
+  , (199, "cento e noventa e nove")
+  , (1000, "mil")
+  , (1008, "mil e oito")
+  , (1985, "mil novecentos e oitenta e cinco")
+  , (3000, "três mil")
+  , (10000, "dez mil")
+  , (100000, "cem mil")
+  , (125000, "cento e vinte e cinco mil")
+  , (735346, "setecentos e trinta e cinco mil trezentos e quarenta e seis")
+  , (dec 6, "um milhão")
+  , (2 * dec 6, "dois milhões")
+  , (dec 7, "dez milhões")
+  , (dec 9, "um bilhão")
+  , (dec 10, "dez bilhões")
+  , (dec 12, "um trilhão")
+  , (dec 13, "dez trilhões")
+  , (dec 15, "um quatrilhão")
+  , (dec 18, "um quintilhão")
+  , (dec 21, "um sextilhão")
+  , (dec 24, "um septilhão")
+  , (dec 27, "um octilhão")
+  , (dec 30, "um nonilhão")
+  , (dec 33, "um decilhão")
+  , (dec 36, "um undecilhão")
+  , (dec 39, "um duodecilhão")
+  , (dec 42, "um tredecilhão")
+  , (dec 100, "dez duotrigintilhões")
+  ]
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "masculine"
+    , masculine defaultInflection
+    , base_cardinals
+      <> [ (1, "um")
+        , (2, "dois")
+        , (21, "vinte e um")
+        , (22, "vinte e dois")
+        , (31, "trinta e um")
+        , (32, "trinta e dois")
+        , (41, "quarenta e um")
+        , (42, "quarenta e dois")
+        , (51, "cinquenta e um")
+        , (52, "cinquenta e dois")
+        , (61, "sessenta e um")
+        , (62, "sessenta e dois")
+        , (71, "setenta e um")
+        , (72, "setenta e dois")
+        , (81, "oitenta e um")
+        , (82, "oitenta e dois")
+        , (91, "noventa e um")
+        , (92, "noventa e dois")
+        , (101, "cento e um")
+        , (200, "duzentos")
+        , (234, "duzentos e trinta e quatro")
+        , (250, "duzentos e cinquenta")
+        , (300, "trezentos")
+        , (330, "trezentos e trinta")
+        , (375, "trezentos e setenta e cinco")
+        , (400, "quatrocentos")
+        , (467, "quatrocentos e sessenta e sete")
+        , (500, "quinhentos")
+        , (600, "seiscentos")
+        , (700, "setecentos")
+        , (800, "oitocentos")
+        , (900, "novecentos")
+        , (2000, "dois mil")
+        , (200000, "duzentos mil")
+        , (500000, "quinhentos mil")
+        , (100001, "cem mil e um")
+        , (101000, "cento e um mil")
+        , (1537469, "um milhão quinhentos e trinta e sete mil quatrocentos e sessenta e nove")
+        ]
+    )
+  , ( "feminine"
+    , feminine defaultInflection
+    , base_cardinals
+      <> [ (1, "uma")
+        , (2, "duas")
+        , (21, "vinte e uma")
+        , (22, "vinte e duas")
+        , (31, "trinta e uma")
+        , (32, "trinta e duas")
+        , (41, "quarenta e uma")
+        , (42, "quarenta e duas")
+        , (51, "cinquenta e uma")
+        , (52, "cinquenta e duas")
+        , (61, "sessenta e uma")
+        , (62, "sessenta e duas")
+        , (71, "setenta e uma")
+        , (72, "setenta e duas")
+        , (81, "oitenta e uma")
+        , (82, "oitenta e duas")
+        , (91, "noventa e uma")
+        , (92, "noventa e duas")
+        , (101, "cento e uma")
+        , (200, "duzentas")
+        , (234, "duzentas e trinta e quatro")
+        , (250, "duzentas e cinquenta")
+        , (300, "trezentas")
+        , (330, "trezentas e trinta")
+        , (375, "trezentas e setenta e cinco")
+        , (400, "quatrocentas")
+        , (467, "quatrocentas e sessenta e sete")
+        , (500, "quinhentas")
+        , (600, "seiscentas")
+        , (700, "setecentas")
+        , (800, "oitocentas")
+        , (900, "novecentas")
+        , (2000, "duas mil")
+        , (200000, "duzentas mil")
+        , (500000, "quinhentas mil")
+        , (100001, "cem mil e uma")
+        , (101000, "cento e uma mil")
+        , (1537469, "um milhão quinhentas e trinta e sete mil quatrocentas e sessenta e nove")
+        ]
+    )
+  ]
+
+-- These are the base forms of the ordinals, stripped of their
+-- ending. Append "o", "os", "a" or "as" to form combinations of
+-- masculine, feminine, singular and plural ordinals.
+base_ordinals :: (Integral i) => [(i, Text)]
+base_ordinals =
+  [ (1, "primeir")
+  , (2, "segund")
+  , (3, "terceir")
+  , (4, "quart")
+  , (5, "quint")
+  , (6, "sext")
+  , (7, "sétim")
+  , (8, "oitav")
+  , (9, "non")
+  , (10, "décim")
+  , (11, "décimo primeir")
+  , (12, "décimo segund")
+  , (13, "décimo terceir")
+  , (20, "vigésim")
+  , (21, "vigésimo primeir")
+  , (30, "trigésim")
+  , (40, "quadragésim")
+  , (50, "qüinquagésim")
+  , (60, "sexagésim")
+  , (70, "septuagésim")
+  , (80, "octogésim")
+  , (90, "nonagésim")
+  , (100, "centésim")
+  , (200, "ducentésim")
+  , (300, "trecentésim")
+  , (400, "quadringentésim")
+  , (500, "qüingentésim")
+  , (600, "sexcentésim")
+  , (700, "setingentésim")
+  , (800, "octingentésim")
+  , (900, "nongentésim")
+  , (1000, "milésim")
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals = map (\(n, f, e) -> ( n
+                             , f defaultInflection
+                             , map (second (<> e)) base_ordinals)
+                             )
+               [ ("masculine singular", masculine . singular, "o")
+               , ("masculine plural",   masculine . plural,   "os")
+               , ("feminine singular",  feminine  . singular, "a")
+               , ("feminine plural",    feminine  . plural,   "as")
+               ]
diff --git a/src-test/Text/Numeral/Language/PT/TestData.hs b/src-test/Text/Numeral/Language/PT/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/PT/TestData.hs
+++ /dev/null
@@ -1,302 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        pt
-
-[@ISO639-2@]        por
-
-[@ISO639-3@]        por
-
-[@Native name@]     Português
-
-[@English name@]    Portuguese
--}
-
-module Text.Numeral.Language.PT.TestData (cardinals, ordinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Control.Arrow ( second )
-import "base" Data.List     ( map )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
-import "base-unicode-symbols" Prelude.Unicode       ( (⋅) )
-import "numerals" Text.Numeral.Grammar
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
--- Sources:
---   http://www.sonia-portuguese.com/text/numerals.htm
---   http://www.smartphrase.com/Portuguese/po_numbers_voc.shtml
-
-base_cardinals ∷ (Integral i) ⇒ [(i, Text)]
-base_cardinals =
-  [ (0, "zero")
-  , (3, "três")
-  , (4, "quatro")
-  , (5, "cinco")
-  , (6, "seis")
-  , (7, "sete")
-  , (8, "oito")
-  , (9, "nove")
-  , (10, "dez")
-  , (11, "onze")
-  , (12, "doze")
-  , (13, "treze")
-  , (14, "catorze")
-  , (15, "quinze")
-  , (16, "dezasseis")
-  , (17, "dezassete")
-  , (18, "dezoito")
-  , (19, "dezanove")
-  , (20, "vinte")
-  , (23, "vinte e três")
-  , (24, "vinte e quatro")
-  , (25, "vinte e cinco")
-  , (26, "vinte e seis")
-  , (27, "vinte e sete")
-  , (28, "vinte e oito")
-  , (29, "vinte e nove")
-  , (30, "trinta")
-  , (33, "trinta e três")
-  , (34, "trinta e quatro")
-  , (35, "trinta e cinco")
-  , (36, "trinta e seis")
-  , (37, "trinta e sete")
-  , (38, "trinta e oito")
-  , (39, "trinta e nove")
-  , (40, "quarenta")
-  , (43, "quarenta e três")
-  , (44, "quarenta e quatro")
-  , (45, "quarenta e cinco")
-  , (46, "quarenta e seis")
-  , (47, "quarenta e sete")
-  , (48, "quarenta e oito")
-  , (49, "quarenta e nove")
-  , (50, "cinquenta")
-  , (53, "cinquenta e três")
-  , (54, "cinquenta e quatro")
-  , (55, "cinquenta e cinco")
-  , (56, "cinquenta e seis")
-  , (57, "cinquenta e sete")
-  , (58, "cinquenta e oito")
-  , (59, "cinquenta e nove")
-  , (60, "sessenta")
-  , (63, "sessenta e três")
-  , (64, "sessenta e quatro")
-  , (65, "sessenta e cinco")
-  , (66, "sessenta e seis")
-  , (67, "sessenta e sete")
-  , (68, "sessenta e oito")
-  , (69, "sessenta e nove")
-  , (70, "setenta")
-  , (73, "setenta e três")
-  , (74, "setenta e quatro")
-  , (75, "setenta e cinco")
-  , (76, "setenta e seis")
-  , (77, "setenta e sete")
-  , (78, "setenta e oito")
-  , (79, "setenta e nove")
-  , (80, "oitenta")
-  , (83, "oitenta e três")
-  , (84, "oitenta e quatro")
-  , (85, "oitenta e cinco")
-  , (86, "oitenta e seis")
-  , (87, "oitenta e sete")
-  , (88, "oitenta e oito")
-  , (89, "oitenta e nove")
-  , (90, "noventa")
-  , (93, "noventa e três")
-  , (94, "noventa e quatro")
-  , (95, "noventa e cinco")
-  , (96, "noventa e seis")
-  , (97, "noventa e sete")
-  , (98, "noventa e oito")
-  , (99, "noventa e nove")
-  , (100, "cem")
-  , (105, "cento e cinco")
-  , (125, "cento e vinte e cinco")
-  , (138, "cento e trinta e oito")
-  , (199, "cento e noventa e nove")
-  , (1000, "mil")
-  , (1008, "mil e oito")
-  , (1985, "mil novecentos e oitenta e cinco")
-  , (3000, "três mil")
-  , (10000, "dez mil")
-  , (100000, "cem mil")
-  , (125000, "cento e vinte e cinco mil")
-  , (735346, "setecentos e trinta e cinco mil trezentos e quarenta e seis")
-  , (dec 6, "um milhão")
-  , (2 ⋅ dec 6, "dois milhões")
-  , (dec 7, "dez milhões")
-  , (dec 9, "um bilhão")
-  , (dec 10, "dez bilhões")
-  , (dec 12, "um trilhão")
-  , (dec 13, "dez trilhões")
-  , (dec 15, "um quatrilhão")
-  , (dec 18, "um quintilhão")
-  , (dec 21, "um sextilhão")
-  , (dec 24, "um septilhão")
-  , (dec 27, "um octilhão")
-  , (dec 30, "um nonilhão")
-  , (dec 33, "um decilhão")
-  , (dec 36, "um undecilhão")
-  , (dec 39, "um duodecilhão")
-  , (dec 42, "um tredecilhão")
-  , (dec 100, "dez duotrigintilhões")
-  ]
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "masculine"
-    , masculine defaultInflection
-    , base_cardinals
-      ⊕ [ (1, "um")
-        , (2, "dois")
-        , (21, "vinte e um")
-        , (22, "vinte e dois")
-        , (31, "trinta e um")
-        , (32, "trinta e dois")
-        , (41, "quarenta e um")
-        , (42, "quarenta e dois")
-        , (51, "cinquenta e um")
-        , (52, "cinquenta e dois")
-        , (61, "sessenta e um")
-        , (62, "sessenta e dois")
-        , (71, "setenta e um")
-        , (72, "setenta e dois")
-        , (81, "oitenta e um")
-        , (82, "oitenta e dois")
-        , (91, "noventa e um")
-        , (92, "noventa e dois")
-        , (101, "cento e um")
-        , (200, "duzentos")
-        , (234, "duzentos e trinta e quatro")
-        , (250, "duzentos e cinquenta")
-        , (300, "trezentos")
-        , (330, "trezentos e trinta")
-        , (375, "trezentos e setenta e cinco")
-        , (400, "quatrocentos")
-        , (467, "quatrocentos e sessenta e sete")
-        , (500, "quinhentos")
-        , (600, "seiscentos")
-        , (700, "setecentos")
-        , (800, "oitocentos")
-        , (900, "novecentos")
-        , (2000, "dois mil")
-        , (200000, "duzentos mil")
-        , (500000, "quinhentos mil")
-        , (100001, "cem mil e um")
-        , (101000, "cento e um mil")
-        , (1537469, "um milhão quinhentos e trinta e sete mil quatrocentos e sessenta e nove")
-        ]
-    )
-  , ( "feminine"
-    , feminine defaultInflection
-    , base_cardinals
-      ⊕ [ (1, "uma")
-        , (2, "duas")
-        , (21, "vinte e uma")
-        , (22, "vinte e duas")
-        , (31, "trinta e uma")
-        , (32, "trinta e duas")
-        , (41, "quarenta e uma")
-        , (42, "quarenta e duas")
-        , (51, "cinquenta e uma")
-        , (52, "cinquenta e duas")
-        , (61, "sessenta e uma")
-        , (62, "sessenta e duas")
-        , (71, "setenta e uma")
-        , (72, "setenta e duas")
-        , (81, "oitenta e uma")
-        , (82, "oitenta e duas")
-        , (91, "noventa e uma")
-        , (92, "noventa e duas")
-        , (101, "cento e uma")
-        , (200, "duzentas")
-        , (234, "duzentas e trinta e quatro")
-        , (250, "duzentas e cinquenta")
-        , (300, "trezentas")
-        , (330, "trezentas e trinta")
-        , (375, "trezentas e setenta e cinco")
-        , (400, "quatrocentas")
-        , (467, "quatrocentas e sessenta e sete")
-        , (500, "quinhentas")
-        , (600, "seiscentas")
-        , (700, "setecentas")
-        , (800, "oitocentas")
-        , (900, "novecentas")
-        , (2000, "duas mil")
-        , (200000, "duzentas mil")
-        , (500000, "quinhentas mil")
-        , (100001, "cem mil e uma")
-        , (101000, "cento e uma mil")
-        , (1537469, "um milhão quinhentas e trinta e sete mil quatrocentas e sessenta e nove")
-        ]
-    )
-  ]
-
--- These are the base forms of the ordinals, stripped of their
--- ending. Append "o", "os", "a" or "as" to form combinations of
--- masculine, feminine, singular and plural ordinals.
-base_ordinals ∷ (Integral i) ⇒ [(i, Text)]
-base_ordinals =
-  [ (1, "primeir")
-  , (2, "segund")
-  , (3, "terceir")
-  , (4, "quart")
-  , (5, "quint")
-  , (6, "sext")
-  , (7, "sétim")
-  , (8, "oitav")
-  , (9, "non")
-  , (10, "décim")
-  , (11, "décimo primeir")
-  , (12, "décimo segund")
-  , (13, "décimo terceir")
-  , (20, "vigésim")
-  , (21, "vigésimo primeir")
-  , (30, "trigésim")
-  , (40, "quadragésim")
-  , (50, "qüinquagésim")
-  , (60, "sexagésim")
-  , (70, "septuagésim")
-  , (80, "octogésim")
-  , (90, "nonagésim")
-  , (100, "centésim")
-  , (200, "ducentésim")
-  , (300, "trecentésim")
-  , (400, "quadringentésim")
-  , (500, "qüingentésim")
-  , (600, "sexcentésim")
-  , (700, "setingentésim")
-  , (800, "octingentésim")
-  , (900, "nongentésim")
-  , (1000, "milésim")
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals = map (\(n, f, e) → ( n
-                             , f defaultInflection
-                             , map (second (⊕ e)) base_ordinals)
-                             )
-               [ ("masculine singular", masculine ∘ singular, "o")
-               , ("masculine plural",   masculine ∘ plural,   "os")
-               , ("feminine singular",  feminine  ∘ singular, "a")
-               , ("feminine plural",    feminine  ∘ plural,   "as")
-               ]
diff --git a/src-test/Text/Numeral/Language/RMN_DZA/TestData.hs b/src-test/Text/Numeral/Language/RMN_DZA/TestData.hs
--- a/src-test/Text/Numeral/Language/RMN_DZA/TestData.hs
+++ b/src-test/Text/Numeral/Language/RMN_DZA/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -36,7 +30,7 @@
 -}
 
 -- Note: This is the Prilep dialect as spoken in Macedonia.
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/RMY_KAL/TestData.hs b/src-test/Text/Numeral/Language/RMY_KAL/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/RMY_KAL/TestData.hs
@@ -0,0 +1,175 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        -
+
+[@Native name@]     -
+
+[@English name@]    Kalderash Romani
+-}
+module Text.Numeral.Language.RMY_KAL.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-kalderash-romani/en/rmy-kal/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "núla")
+      , (1, "jek")
+      , (2, "duj")
+      , (3, "trin")
+      , (4, "štar")
+      , (5, "panź")
+      , (6, "šov")
+      , (7, "jefta")
+      , (8, "oxto")
+      , (9, "iňa")
+      , (10, "deš")
+      , (11, "dešujek")
+      , (12, "dešuduj")
+      , (13, "dešutrin")
+      , (14, "dešuštar")
+      , (15, "dešupanź")
+      , (16, "dešušov")
+      , (17, "dešjefta")
+      , (18, "dešoxto")
+      , (19, "dešuiňa")
+      , (20, "biš")
+      , (21, "biš taj jek")
+      , (22, "biš taj duj")
+      , (23, "biš taj trin")
+      , (24, "biš taj štar")
+      , (25, "biš taj panź")
+      , (26, "biš taj šov")
+      , (27, "biš taj jefta")
+      , (28, "biš taj oxto")
+      , (29, "biš taj iňa")
+      , (30, "tranda")
+      , (31, "tranda taj jek")
+      , (32, "tranda taj duj")
+      , (33, "tranda taj trin")
+      , (34, "tranda taj štar")
+      , (35, "tranda taj panź")
+      , (36, "tranda taj šov")
+      , (37, "tranda taj jefta")
+      , (38, "tranda taj oxto")
+      , (39, "tranda taj iňa")
+      , (40, "saranda")
+      , (41, "saranda taj jek")
+      , (42, "saranda taj duj")
+      , (43, "saranda taj trin")
+      , (44, "saranda taj štar")
+      , (45, "saranda taj panź")
+      , (46, "saranda taj šov")
+      , (47, "saranda taj jefta")
+      , (48, "saranda taj oxto")
+      , (49, "saranda taj iňa")
+      , (50, "pinda")
+      , (51, "pinda taj jek")
+      , (52, "pinda taj duj")
+      , (53, "pinda taj trin")
+      , (54, "pinda taj štar")
+      , (55, "pinda taj panź")
+      , (56, "pinda taj šov")
+      , (57, "pinda taj jefta")
+      , (58, "pinda taj oxto")
+      , (59, "pinda taj iňa")
+      , (60, "šovardeš")
+      , (61, "šovardeš taj jek")
+      , (62, "šovardeš taj duj")
+      , (63, "šovardeš taj trin")
+      , (64, "šovardeš taj štar")
+      , (65, "šovardeš taj panź")
+      , (66, "šovardeš taj šov")
+      , (67, "šovardeš taj jefta")
+      , (68, "šovardeš taj oxto")
+      , (69, "šovardeš taj iňa")
+      , (70, "jeftavardeš")
+      , (71, "jeftavardeš taj jek")
+      , (72, "jeftavardeš taj duj")
+      , (73, "jeftavardeš taj trin")
+      , (74, "jeftavardeš taj štar")
+      , (75, "jeftavardeš taj panź")
+      , (76, "jeftavardeš taj šov")
+      , (77, "jeftavardeš taj jefta")
+      , (78, "jeftavardeš taj oxto")
+      , (79, "jeftavardeš taj iňa")
+      , (80, "oxtovardeš")
+      , (81, "oxtovardeš taj jek")
+      , (82, "oxtovardeš taj duj")
+      , (83, "oxtovardeš taj trin")
+      , (84, "oxtovardeš taj štar")
+      , (85, "oxtovardeš taj panź")
+      , (86, "oxtovardeš taj šov")
+      , (87, "oxtovardeš taj jefta")
+      , (88, "oxtovardeš taj oxto")
+      , (89, "oxtovardeš taj iňa")
+      , (90, "iňavardeš")
+      , (91, "iňavardeš taj jek")
+      , (92, "iňavardeš taj duj")
+      , (93, "iňavardeš taj trin")
+      , (94, "iňavardeš taj štar")
+      , (95, "iňavardeš taj panź")
+      , (96, "iňavardeš taj šov")
+      , (97, "iňavardeš taj jefta")
+      , (98, "iňavardeš taj oxto")
+      , (99, "iňavardeš taj iňa")
+      , (100, "šêl")
+      , (101, "šêl jek")
+      , (102, "šêl duj")
+      , (103, "šêl trin")
+      , (104, "šêl štar")
+      , (105, "šêl panź")
+      , (106, "šêl šov")
+      , (107, "šêl jefta")
+      , (108, "šêl oxto")
+      , (109, "šêl iňa")
+      , (110, "šêl deš")
+      , (123, "šêl biš taj trin")
+      , (200, "duj šêla")
+      , (300, "trin šêla")
+      , (321, "trin šêla biš taj jek")
+      , (400, "štar šêla")
+      , (500, "panź šêla")
+      , (600, "šov šêla")
+      , (700, "jefta šêla")
+      , (800, "oxto šêla")
+      , (900, "iňa šêla")
+      , (909, "iňa šêla iňa")
+      , (990, "iňa šêla iňavardeš")
+      , (999, "iňa šêla iňavardeš taj iňa")
+      , (1000, "mija")
+      , (1001, "mija jek")
+      , (1008, "mija oxto")
+      , (1234, "mija duj šêla tranda taj štar")
+      , (2000, "duj miji")
+      , (3000, "trin miji")
+      , (4000, "štar miji")
+      , (4321, "štar miji trin šêla biš taj jek")
+      , (5000, "panź miji")
+      , (6000, "šov miji")
+      , (7000, "jefta miji")
+      , (8000, "oxto miji")
+      , (9000, "iňa miji")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/RO/TestData.hs b/src-test/Text/Numeral/Language/RO/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/RO/TestData.hs
+++ /dev/null
@@ -1,144 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        ro
-
-[@ISO639-2B@]       rum
-
-[@ISO639-2T@]       ron
-
-[@ISO639-3@]        ron
-
-[@Native name@]     română
-
-[@English name@]    Romanian
--}
-
-module Text.Numeral.Language.RO.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "zero")
-      , (1, "unu")
-      , (2, "doi")
-      , (3, "trei")
-      , (4, "patru")
-      , (5, "cinci")
-      , (6, "sase")
-      , (7, "sapte")
-      , (8, "opt")
-      , (9, "noua")
-      , (10, "zece")
-      , (11, "unsprezece")
-      , (12, "doisprezece")
-      , (13, "treisprezece")
-      , (14, "paisprezece")
-      , (15, "cincisprezece")
-      , (16, "saisprezece")
-      , (17, "saptesprezece")
-      , (18, "optsprezece")
-      , (19, "nouasprezece")
-      , (20, "douazeci")
-      , (21, "douazecisiunu")
-      , (22, "douazecisidoi")
-      , (23, "douazecisitrei")
-      , (24, "douazecisipatru")
-      , (25, "douazecisicinci")
-      , (26, "douazecisisase")
-      , (27, "douazecisisapte")
-      , (28, "douazecisiopt")
-      , (29, "douazecisinoua")
-      , (30, "treizeci")
-      , (31, "treizecisiunu")
-      , (32, "treizecisidoi")
-      , (33, "treizecisitrei")
-      , (34, "treizecisipatru")
-      , (35, "treizecisicinci")
-      , (36, "treizecisisase")
-      , (37, "treizecisisapte")
-      , (38, "treizecisiopt")
-      , (39, "treizecisinoua")
-      , (40, "patruzeci")
-      , (41, "patruzecisiunu")
-      , (42, "patruzecisidoi")
-      , (43, "patruzecisitrei")
-      , (44, "patruzecisipatru")
-      , (45, "patruzecisicinci")
-      , (46, "patruzecisisase")
-      , (47, "patruzecisisapte")
-      , (48, "patruzecisiopt")
-      , (49, "patruzecisinoua")
-      , (50, "cincizeci")
-      , (51, "cincizecisiunu")
-      , (52, "cincizecisidoi")
-      , (53, "cincizecisitrei")
-      , (54, "cincizecisipatru")
-      , (55, "cincizecisicinci")
-      , (56, "cincizecisisase")
-      , (57, "cincizecisisapte")
-      , (58, "cincizecisiopt")
-      , (59, "cincizecisinoua")
-      , (60, "saizeci")
-      , (61, "saizecisiunu")
-      , (62, "saizecisidoi")
-      , (63, "saizecisitrei")
-      , (64, "saizecisipatru")
-      , (65, "saizecisicinci")
-      , (66, "saizecisisase")
-      , (67, "saizecisisapte")
-      , (68, "saizecisiopt")
-      , (69, "saizecisinoua")
-      , (70, "saptezeci")
-      , (71, "saptezecisiunu")
-      , (72, "saptezecisidoi")
-      , (73, "saptezecisitrei")
-      , (74, "saptezecisipatru")
-      , (75, "saptezecisicinci")
-      , (76, "saptezecisisase")
-      , (77, "saptezecisisapte")
-      , (78, "saptezecisiopt")
-      , (79, "saptezecisinoua")
-      , (80, "optzeci")
-      , (81, "optzecisiunu")
-      , (82, "optzecisidoi")
-      , (83, "optzecisitrei")
-      , (84, "optzecisipatru")
-      , (85, "optzecisicinci")
-      , (86, "optzecisisase")
-      , (87, "optzecisisapte")
-      , (88, "optzecisiopt")
-      , (89, "optzecisinoua")
-      , (90, "nouazeci")
-      , (91, "nouazecisiunu")
-      , (92, "nouazecisidoi")
-      , (93, "nouazecisitrei")
-      , (94, "nouazecisipatru")
-      , (95, "nouazecisicinci")
-      , (96, "nouazecisisase")
-      , (97, "nouazecisisapte")
-      , (98, "nouazecisiopt")
-      , (99, "nouazecisinoua")
-      , (100, "o suta")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/RON/TestData.hs b/src-test/Text/Numeral/Language/RON/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/RON/TestData.hs
@@ -0,0 +1,137 @@
+{-|
+[@ISO639-1@]        ro
+
+[@ISO639-2B@]       rum
+
+[@ISO639-2T@]       ron
+
+[@ISO639-3@]        ron
+
+[@Native name@]     română
+
+[@English name@]    Romanian
+-}
+
+module Text.Numeral.Language.RON.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "zero")
+      , (1, "unu")
+      , (2, "doi")
+      , (3, "trei")
+      , (4, "patru")
+      , (5, "cinci")
+      , (6, "sase")
+      , (7, "sapte")
+      , (8, "opt")
+      , (9, "noua")
+      , (10, "zece")
+      , (11, "unsprezece")
+      , (12, "doisprezece")
+      , (13, "treisprezece")
+      , (14, "paisprezece")
+      , (15, "cincisprezece")
+      , (16, "saisprezece")
+      , (17, "saptesprezece")
+      , (18, "optsprezece")
+      , (19, "nouasprezece")
+      , (20, "douazeci")
+      , (21, "douazecisiunu")
+      , (22, "douazecisidoi")
+      , (23, "douazecisitrei")
+      , (24, "douazecisipatru")
+      , (25, "douazecisicinci")
+      , (26, "douazecisisase")
+      , (27, "douazecisisapte")
+      , (28, "douazecisiopt")
+      , (29, "douazecisinoua")
+      , (30, "treizeci")
+      , (31, "treizecisiunu")
+      , (32, "treizecisidoi")
+      , (33, "treizecisitrei")
+      , (34, "treizecisipatru")
+      , (35, "treizecisicinci")
+      , (36, "treizecisisase")
+      , (37, "treizecisisapte")
+      , (38, "treizecisiopt")
+      , (39, "treizecisinoua")
+      , (40, "patruzeci")
+      , (41, "patruzecisiunu")
+      , (42, "patruzecisidoi")
+      , (43, "patruzecisitrei")
+      , (44, "patruzecisipatru")
+      , (45, "patruzecisicinci")
+      , (46, "patruzecisisase")
+      , (47, "patruzecisisapte")
+      , (48, "patruzecisiopt")
+      , (49, "patruzecisinoua")
+      , (50, "cincizeci")
+      , (51, "cincizecisiunu")
+      , (52, "cincizecisidoi")
+      , (53, "cincizecisitrei")
+      , (54, "cincizecisipatru")
+      , (55, "cincizecisicinci")
+      , (56, "cincizecisisase")
+      , (57, "cincizecisisapte")
+      , (58, "cincizecisiopt")
+      , (59, "cincizecisinoua")
+      , (60, "saizeci")
+      , (61, "saizecisiunu")
+      , (62, "saizecisidoi")
+      , (63, "saizecisitrei")
+      , (64, "saizecisipatru")
+      , (65, "saizecisicinci")
+      , (66, "saizecisisase")
+      , (67, "saizecisisapte")
+      , (68, "saizecisiopt")
+      , (69, "saizecisinoua")
+      , (70, "saptezeci")
+      , (71, "saptezecisiunu")
+      , (72, "saptezecisidoi")
+      , (73, "saptezecisitrei")
+      , (74, "saptezecisipatru")
+      , (75, "saptezecisicinci")
+      , (76, "saptezecisisase")
+      , (77, "saptezecisisapte")
+      , (78, "saptezecisiopt")
+      , (79, "saptezecisinoua")
+      , (80, "optzeci")
+      , (81, "optzecisiunu")
+      , (82, "optzecisidoi")
+      , (83, "optzecisitrei")
+      , (84, "optzecisipatru")
+      , (85, "optzecisicinci")
+      , (86, "optzecisisase")
+      , (87, "optzecisisapte")
+      , (88, "optzecisiopt")
+      , (89, "optzecisinoua")
+      , (90, "nouazeci")
+      , (91, "nouazecisiunu")
+      , (92, "nouazecisidoi")
+      , (93, "nouazecisitrei")
+      , (94, "nouazecisipatru")
+      , (95, "nouazecisicinci")
+      , (96, "nouazecisisase")
+      , (97, "nouazecisisapte")
+      , (98, "nouazecisiopt")
+      , (99, "nouazecisinoua")
+      , (100, "o suta")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/RU/TestData.hs b/src-test/Text/Numeral/Language/RU/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/RU/TestData.hs
+++ /dev/null
@@ -1,192 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        ru
-
-[@ISO639-2@]        rus
-
-[@ISO639-3@]        rus
-
-[@Native name@]     Русский язык
-
-[@English name@]    Russian
--}
-
-module Text.Numeral.Language.RU.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://en.wikibooks.org/wiki/Russian/Numbers
-  http://russian.speak7.com/russian_numbers.htm
-  http://learningrussian.net/games_verbs_grammar3.php
-  http://www.waytorussia.net/WhatIsRussia/Russian/Part1a.html
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "ноль")
-      , (1, "один")
-      , (2, "два")
-      , (3, "три")
-      , (4, "четыре")
-      , (5, "пять")
-      , (6, "шесть")
-      , (7, "семь")
-      , (8, "восемь")
-      , (9, "девять")
-      , (10, "десять")
-      , (11, "одиннадцать")
-      , (12, "двенадцать")
-      , (13, "тринадцать")
-      , (14, "четырнадцать")
-      , (15, "пятнадцать")
-      , (16, "шестнадцать")
-      , (17, "семнадцать")
-      , (18, "восемнадцать")
-      , (19, "девятнадцать")
-      , (20, "двадцать")
-      , (21, "двадцать один")
-      , (22, "двадцать два")
-      , (23, "двадцать три")
-      , (24, "двадцать четыре")
-      , (25, "двадцать пять")
-      , (26, "двадцать шесть")
-      , (27, "двадцать семь")
-      , (28, "двадцать восемь")
-      , (29, "двадцать девять")
-      , (30, "тридцать")
-      , (31, "тридцать один")
-      , (32, "тридцать два")
-      , (33, "тридцать три")
-      , (34, "тридцать четыре")
-      , (35, "тридцать пять")
-      , (36, "тридцать шесть")
-      , (37, "тридцать семь")
-      , (38, "тридцать восемь")
-      , (39, "тридцать девять")
-      , (40, "сорок")
-      , (41, "сорок один")
-      , (42, "сорок два")
-      , (43, "сорок три")
-      , (44, "сорок четыре")
-      , (45, "сорок пять")
-      , (46, "сорок шесть")
-      , (47, "сорок семь")
-      , (48, "сорок восемь")
-      , (49, "сорок девять")
-      , (50, "пятьдесят")
-      , (51, "пятьдесят один")
-      , (52, "пятьдесят два")
-      , (53, "пятьдесят три")
-      , (54, "пятьдесят четыре")
-      , (55, "пятьдесят пять")
-      , (56, "пятьдесят шесть")
-      , (57, "пятьдесят семь")
-      , (58, "пятьдесят восемь")
-      , (59, "пятьдесят девять")
-      , (60, "шестьдесят")
-      , (61, "шестьдесят один")
-      , (62, "шестьдесят два")
-      , (63, "шестьдесят три")
-      , (64, "шестьдесят четыре")
-      , (65, "шестьдесят пять")
-      , (66, "шестьдесят шесть")
-      , (67, "шестьдесят семь")
-      , (68, "шестьдесят восемь")
-      , (69, "шестьдесят девять")
-      , (70, "семьдесят")
-      , (71, "семьдесят один")
-      , (72, "семьдесят два")
-      , (73, "семьдесят три")
-      , (74, "семьдесят четыре")
-      , (75, "семьдесят пять")
-      , (76, "семьдесят шесть")
-      , (77, "семьдесят семь")
-      , (78, "семьдесят восемь")
-      , (79, "семьдесят девять")
-      , (80, "восемьдесят")
-      , (81, "восемьдесят один")
-      , (82, "восемьдесят два")
-      , (83, "восемьдесят три")
-      , (84, "восемьдесят четыре")
-      , (85, "восемьдесят пять")
-      , (86, "восемьдесят шесть")
-      , (87, "восемьдесят семь")
-      , (88, "восемьдесят восемь")
-      , (89, "восемьдесят девять")
-      , (90, "девяносто")
-      , (91, "девяносто один")
-      , (92, "девяносто два")
-      , (93, "девяносто три")
-      , (94, "девяносто четыре")
-      , (95, "девяносто пять")
-      , (96, "девяносто шесть")
-      , (97, "девяносто семь")
-      , (98, "девяносто восемь")
-      , (99, "девяносто девять")
-      , (100, "сто")
-      , (101, "сто один")
-      , (108, "сто восемь")
-      , (110, "сто десять")
-      , (115, "сто пятнадцать")
-      , (121, "сто двадцать один")
-      , (133, "сто тридцать три")
-      , (147, "сто сорок семь")
-      , (200, "двести")
-      , (300, "триста")
-      , (400, "четыреста")
-      , (500, "пятьсот")
-      , (600, "шестьсот")
-      , (700, "семьсот")
-      , (800, "восемьсот")
-      , (900, "девятьсот")
-      , (1000, "тысяча")
-      , (2000, "две тысячи")
-      , (3000, "три тысячи")
-      , (5000, "пять тысяч")
-      , (6000, "шесть тысяч")
-      , (9000, "девять тысяч")
-      , (16000, "шестнадцать тысяч")
-      , (21000, "двадцать одна тысяча")
-      , (22000, "двадцать две тысячи")
-      , (23000, "двадцать три тысячи")
-      , (28000, "двадцать восемь тысяч")
-      , (41000, "сорок одна тысяча")
-      , (42000, "сорок две тысячи")
-      , (49000, "сорок девять тысяч")
-      , (100000, "сто тысяч")
-      , (200000, "двести тысяч")
-      , (300000, "триста тысяч")
-      , (300001, "триста тысяч один")
-      , (300020, "триста тысяч двадцать")
-      , (300825, "триста тысячь восемьсот двадцать пять")
-      , (dec 6, "один миллион")
-      , (2 ⋅ dec 6, "два миллиона")
-      , (5 ⋅ dec 6, "пять миллионов")
-      , (dec 9, "один миллиард")
-      , (2 ⋅ dec 9, "два миллиарда")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/RUS/TestData.hs b/src-test/Text/Numeral/Language/RUS/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/RUS/TestData.hs
@@ -0,0 +1,184 @@
+{-|
+[@ISO639-1@]        ru
+
+[@ISO639-2@]        rus
+
+[@ISO639-3@]        rus
+
+[@Native name@]     Русский язык
+
+[@English name@]    Russian
+-}
+
+module Text.Numeral.Language.RUS.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://en.wikibooks.org/wiki/Russian/Numbers
+  http://russian.speak7.com/russian_numbers.htm
+  http://learningrussian.net/games_verbs_grammar3.php
+  http://www.waytorussia.net/WhatIsRussia/Russian/Part1a.html
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "ноль")
+      , (1, "один")
+      , (2, "два")
+      , (3, "три")
+      , (4, "четыре")
+      , (5, "пять")
+      , (6, "шесть")
+      , (7, "семь")
+      , (8, "восемь")
+      , (9, "девять")
+      , (10, "десять")
+      , (11, "одиннадцать")
+      , (12, "двенадцать")
+      , (13, "тринадцать")
+      , (14, "четырнадцать")
+      , (15, "пятнадцать")
+      , (16, "шестнадцать")
+      , (17, "семнадцать")
+      , (18, "восемнадцать")
+      , (19, "девятнадцать")
+      , (20, "двадцать")
+      , (21, "двадцать один")
+      , (22, "двадцать два")
+      , (23, "двадцать три")
+      , (24, "двадцать четыре")
+      , (25, "двадцать пять")
+      , (26, "двадцать шесть")
+      , (27, "двадцать семь")
+      , (28, "двадцать восемь")
+      , (29, "двадцать девять")
+      , (30, "тридцать")
+      , (31, "тридцать один")
+      , (32, "тридцать два")
+      , (33, "тридцать три")
+      , (34, "тридцать четыре")
+      , (35, "тридцать пять")
+      , (36, "тридцать шесть")
+      , (37, "тридцать семь")
+      , (38, "тридцать восемь")
+      , (39, "тридцать девять")
+      , (40, "сорок")
+      , (41, "сорок один")
+      , (42, "сорок два")
+      , (43, "сорок три")
+      , (44, "сорок четыре")
+      , (45, "сорок пять")
+      , (46, "сорок шесть")
+      , (47, "сорок семь")
+      , (48, "сорок восемь")
+      , (49, "сорок девять")
+      , (50, "пятьдесят")
+      , (51, "пятьдесят один")
+      , (52, "пятьдесят два")
+      , (53, "пятьдесят три")
+      , (54, "пятьдесят четыре")
+      , (55, "пятьдесят пять")
+      , (56, "пятьдесят шесть")
+      , (57, "пятьдесят семь")
+      , (58, "пятьдесят восемь")
+      , (59, "пятьдесят девять")
+      , (60, "шестьдесят")
+      , (61, "шестьдесят один")
+      , (62, "шестьдесят два")
+      , (63, "шестьдесят три")
+      , (64, "шестьдесят четыре")
+      , (65, "шестьдесят пять")
+      , (66, "шестьдесят шесть")
+      , (67, "шестьдесят семь")
+      , (68, "шестьдесят восемь")
+      , (69, "шестьдесят девять")
+      , (70, "семьдесят")
+      , (71, "семьдесят один")
+      , (72, "семьдесят два")
+      , (73, "семьдесят три")
+      , (74, "семьдесят четыре")
+      , (75, "семьдесят пять")
+      , (76, "семьдесят шесть")
+      , (77, "семьдесят семь")
+      , (78, "семьдесят восемь")
+      , (79, "семьдесят девять")
+      , (80, "восемьдесят")
+      , (81, "восемьдесят один")
+      , (82, "восемьдесят два")
+      , (83, "восемьдесят три")
+      , (84, "восемьдесят четыре")
+      , (85, "восемьдесят пять")
+      , (86, "восемьдесят шесть")
+      , (87, "восемьдесят семь")
+      , (88, "восемьдесят восемь")
+      , (89, "восемьдесят девять")
+      , (90, "девяносто")
+      , (91, "девяносто один")
+      , (92, "девяносто два")
+      , (93, "девяносто три")
+      , (94, "девяносто четыре")
+      , (95, "девяносто пять")
+      , (96, "девяносто шесть")
+      , (97, "девяносто семь")
+      , (98, "девяносто восемь")
+      , (99, "девяносто девять")
+      , (100, "сто")
+      , (101, "сто один")
+      , (108, "сто восемь")
+      , (110, "сто десять")
+      , (115, "сто пятнадцать")
+      , (121, "сто двадцать один")
+      , (133, "сто тридцать три")
+      , (147, "сто сорок семь")
+      , (200, "двести")
+      , (300, "триста")
+      , (400, "четыреста")
+      , (500, "пятьсот")
+      , (600, "шестьсот")
+      , (700, "семьсот")
+      , (800, "восемьсот")
+      , (900, "девятьсот")
+      , (1000, "тысяча")
+      , (2000, "две тысячи")
+      , (3000, "три тысячи")
+      , (5000, "пять тысяч")
+      , (6000, "шесть тысяч")
+      , (9000, "девять тысяч")
+      , (16000, "шестнадцать тысяч")
+      , (21000, "двадцать одна тысяча")
+      , (22000, "двадцать две тысячи")
+      , (23000, "двадцать три тысячи")
+      , (28000, "двадцать восемь тысяч")
+      , (41000, "сорок одна тысяча")
+      , (42000, "сорок две тысячи")
+      , (49000, "сорок девять тысяч")
+      , (100000, "сто тысяч")
+      , (200000, "двести тысяч")
+      , (300000, "триста тысяч")
+      , (300001, "триста тысяч один")
+      , (300020, "триста тысяч двадцать")
+      , (300825, "триста тысячь восемьсот двадцать пять")
+      , (dec 6, "один миллион")
+      , (2 * dec 6, "два миллиона")
+      , (5 * dec 6, "пять миллионов")
+      , (dec 9, "один миллиард")
+      , (2 * dec 9, "два миллиарда")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/SCO/TestData.hs b/src-test/Text/Numeral/Language/SCO/TestData.hs
--- a/src-test/Text/Numeral/Language/SCO/TestData.hs
+++ b/src-test/Text/Numeral/Language/SCO/TestData.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -23,8 +17,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -37,7 +30,7 @@
   http://www.sf.airnet.ne.jp/~ts/language/number/scots.html
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/SME/TestData.hs b/src-test/Text/Numeral/Language/SME/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/SME/TestData.hs
@@ -0,0 +1,208 @@
+{-|
+[@ISO639-1@]        se
+
+[@ISO639-2@]        sme
+
+[@ISO639-3@]        sme
+
+[@Native name@]     davvisámegiella
+
+[@English name@]    Northern Sami
+-}
+module Text.Numeral.Language.SME.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-northern-sami/en/sme/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "okta")
+      , (2, "guokte")
+      , (3, "golbma")
+      , (4, "njeallje")
+      , (5, "vihtta")
+      , (6, "guhtta")
+      , (7, "čieža")
+      , (8, "gávcci")
+      , (9, "ovcci")
+      , (10, "logi")
+      , (11, "oktanuppelohkái")
+      , (12, "guoktenuppelohkái")
+      , (13, "golbmanuppelohkái")
+      , (14, "njealljenuppelohkái")
+      , (15, "vihttanuppelohkái")
+      , (16, "guhttanuppelohkái")
+      , (17, "čiežanuppelohkái")
+      , (18, "gávccinuppelohkái")
+      , (19, "ovccinuppelohkái")
+      , (20, "guoktelogi")
+      , (21, "guoktelogiokta")
+      , (22, "guoktelogiguokte")
+      , (23, "guoktelogigolbma")
+      , (24, "guokteloginjeallje")
+      , (25, "guoktelogivihtta")
+      , (26, "guoktelogiguhtta")
+      , (27, "guoktelogičieža")
+      , (28, "guoktelogigávcci")
+      , (29, "guoktelogiovcci")
+      , (30, "golbmalogi")
+      , (31, "golbmalogiokta")
+      , (32, "golbmalogiguokte")
+      , (33, "golbmalogigolbma")
+      , (34, "golbmaloginjeallje")
+      , (35, "golbmalogivihtta")
+      , (36, "golbmalogiguhtta")
+      , (37, "golbmalogičieža")
+      , (38, "golbmalogigávcci")
+      , (39, "golbmalogiovcci")
+      , (40, "njealljelogi")
+      , (41, "njealljelogiokta")
+      , (42, "njealljelogiguokte")
+      , (43, "njealljelogigolbma")
+      , (44, "njealljeloginjeallje")
+      , (45, "njealljelogivihtta")
+      , (46, "njealljelogiguhtta")
+      , (47, "njealljelogičieža")
+      , (48, "njealljelogigávcci")
+      , (49, "njealljelogiovcci")
+      , (50, "vihttalogi")
+      , (51, "vihttalogiokta")
+      , (52, "vihttalogiguokte")
+      , (53, "vihttalogigolbma")
+      , (54, "vihttaloginjeallje")
+      , (55, "vihttalogivihtta")
+      , (56, "vihttalogiguhtta")
+      , (57, "vihttalogičieža")
+      , (58, "vihttalogigávcci")
+      , (59, "vihttalogiovcci")
+      , (60, "guhttalogi")
+      , (61, "guhttalogiokta")
+      , (62, "guhttalogiguokte")
+      , (63, "guhttalogigolbma")
+      , (64, "guhttaloginjeallje")
+      , (65, "guhttalogivihtta")
+      , (66, "guhttalogiguhtta")
+      , (67, "guhttalogičieža")
+      , (68, "guhttalogigávcci")
+      , (69, "guhttalogiovcci")
+      , (70, "čiežalogi")
+      , (71, "čiežalogiokta")
+      , (72, "čiežalogiguokte")
+      , (73, "čiežalogigolbma")
+      , (74, "čiežaloginjeallje")
+      , (75, "čiežalogivihtta")
+      , (76, "čiežalogiguhtta")
+      , (77, "čiežalogičieža")
+      , (78, "čiežalogigávcci")
+      , (79, "čiežalogiovcci")
+      , (80, "gávccilogi")
+      , (81, "gávccilogiokta")
+      , (82, "gávccilogiguokte")
+      , (83, "gávccilogigolbma")
+      , (84, "gávcciloginjeallje")
+      , (85, "gávccilogivihtta")
+      , (86, "gávccilogiguhtta")
+      , (87, "gávccilogičieža")
+      , (88, "gávccilogigávcci")
+      , (89, "gávccilogiovcci")
+      , (90, "ovccilogi")
+      , (91, "ovccilogiokta")
+      , (92, "ovccilogiguokte")
+      , (93, "ovccilogigolbma")
+      , (94, "ovcciloginjeallje")
+      , (95, "ovccilogivihtta")
+      , (96, "ovccilogiguhtta")
+      , (97, "ovccilogičieža")
+      , (98, "ovccilogigávcci")
+      , (99, "ovccilogiovcci")
+      , (100, "čuođi")
+      , (101, "čuođiokta")
+      , (102, "čuođiguokte")
+      , (103, "čuođigolbma")
+      , (104, "čuođinjeallje")
+      , (105, "čuođivihtta")
+      , (106, "čuođiguhtta")
+      , (107, "čuođičieža")
+      , (108, "čuođigávcci")
+      , (109, "čuođiovcci")
+      , (110, "čuođilogi")
+      , (123, "čuođiguoktelogigolbma")
+      , (200, "guoktečuođi")
+      , (300, "golbmačuođi")
+      , (321, "golbmačuođiguoktelogiokta")
+      , (400, "njeallječuođi")
+      , (500, "vihttačuođi")
+      , (600, "guhttačuođi")
+      , (700, "čiežačuođi")
+      , (800, "gávccičuođi")
+      , (900, "ovccičuođi")
+      , (909, "ovccičuođiovcci")
+      , (990, "ovccičuođiovccilogi")
+      , (999, "ovccičuođiovccilogiovcci")
+      , (1000, "duhat")
+      , (1001, "duhatokta")
+      , (1008, "duhatgávcci")
+      , (1234, "duhatguoktečuođigolbmaloginjeallje")
+      , (2000, "guokteduhat")
+      , (3000, "golbmaduhat")
+      , (4000, "njealljeduhat")
+      , (4321, "njealljeduhatgolbmačuođiguoktelogiokta")
+      , (5000, "vihttaduhat")
+      , (6000, "guhttaduhat")
+      , (7000, "čiežaduhat")
+      , (8000, "gávcciduhat")
+      , (9000, "ovcciduhat")
+      , (10000, "logi duhat")
+      , (12345, "guoktenuppelohkái duhatgolbmačuođinjealljelogivihtta")
+      , (20000, "guoktelogi duhat")
+      , (30000, "golbmalogi duhat")
+      , (40000, "njealljelogi duhat")
+      , (50000, "vihttalogi duhat")
+      , (54321, "vihttaloginjealljeduhatgolbmačuođiguoktelogiokta")
+      , (60000, "guhttalogi duhat")
+      , (70000, "čiežalogi duhat")
+      , (80000, "gávccilogi duhat")
+      , (90000, "ovccilogi duhat")
+      , (100000, "čuođi duhat")
+      , (123456, "čuođiguoktelogigolbmaduhatnjeallječuođivihttalogiguhtta")
+      , (200000, "guoktečuođi duhat")
+      , (300000, "golbmačuođi duhat")
+      , (400000, "njeallječuođi duhat")
+      , (500000, "vihttačuođi duhat")
+      , (600000, "guhttačuođi duhat")
+      , (654321, "guhttačuođivihttaloginjealljeduhatgolbmačuođiguoktelogiokta")
+      , (700000, "čiežačuođi duhat")
+      , (800000, "gávccičuođi duhat")
+      , (900000, "ovccičuođi duhat")
+      , (1000000, "miljon")
+      , (1000001, "miljonokta")
+      , (1234567, "miljonguoktečuođigolbmaloginjealljeduhatvihttačuođiguhttalogičieža")
+      , (2000000, "guoktemiljovnna")
+      , (3000000, "golbmamiljovnna")
+      , (4000000, "njealljemiljovnna")
+      , (5000000, "vihttamiljovnna")
+      , (6000000, "guhttamiljovnna")
+      , (7000000, "čiežamiljovnna")
+      , (7654321, "čiežamiljovnnaguhttačuođivihttaloginjealljeduhatgolbmačuođiguoktelogiokta")
+      , (8000000, "gávccimiljovnna")
+      , (9000000, "ovccimiljovnna")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/SMN/TestData.hs b/src-test/Text/Numeral/Language/SMN/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/SMN/TestData.hs
@@ -0,0 +1,208 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        smn
+
+[@ISO639-3@]        smn
+
+[@Native name@]     anarâškielâ
+
+[@English name@]    Inari Sami
+-}
+module Text.Numeral.Language.SMN.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-inari-sami/en/smn/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "ohtâ")
+      , (2, "kyehti")
+      , (3, "kulmâ")
+      , (4, "nelji")
+      , (5, "vittâ")
+      , (6, "kuttâ")
+      , (7, "čiččâm")
+      , (8, "käävci")
+      , (9, "oovce")
+      , (10, "love")
+      , (11, "ohtunubáloh")
+      , (12, "kyehtnubáloh")
+      , (13, "kulmânubáloh")
+      , (14, "neljinubáloh")
+      , (15, "vittânubáloh")
+      , (16, "kuttânubáloh")
+      , (17, "čiččâmnubáloh")
+      , (18, "käävcinubáloh")
+      , (19, "oovcenubáloh")
+      , (20, "kyehtlov")
+      , (21, "kyehtlovohtâ")
+      , (22, "kyehtlovkyehti")
+      , (23, "kyehtlovkulmâ")
+      , (24, "kyehtlovnelji")
+      , (25, "kyehtlovvittâ")
+      , (26, "kyehtlovkuttâ")
+      , (27, "kyehtlovčiččâm")
+      , (28, "kyehtlovkäävci")
+      , (29, "kyehtlovoovce")
+      , (30, "kulmâlov")
+      , (31, "kulmâlovohtâ")
+      , (32, "kulmâlovkyehti")
+      , (33, "kulmâlovkulmâ")
+      , (34, "kulmâlovnelji")
+      , (35, "kulmâlovvittâ")
+      , (36, "kulmâlovkuttâ")
+      , (37, "kulmâlovčiččâm")
+      , (38, "kulmâlovkäävci")
+      , (39, "kulmâlovoovce")
+      , (40, "neljilov")
+      , (41, "neljilovohtâ")
+      , (42, "neljilovkyehti")
+      , (43, "neljilovkulmâ")
+      , (44, "neljilovnelji")
+      , (45, "neljilovvittâ")
+      , (46, "neljilovkuttâ")
+      , (47, "neljilovčiččâm")
+      , (48, "neljilovkäävci")
+      , (49, "neljilovoovce")
+      , (50, "vittlov")
+      , (51, "vittlovohtâ")
+      , (52, "vittlovkyehti")
+      , (53, "vittlovkulmâ")
+      , (54, "vittlovnelji")
+      , (55, "vittlovvittâ")
+      , (56, "vittlovkuttâ")
+      , (57, "vittlovčiččâm")
+      , (58, "vittlovkäävci")
+      , (59, "vittlovoovce")
+      , (60, "kuttlov")
+      , (61, "kuttlovohtâ")
+      , (62, "kuttlovkyehti")
+      , (63, "kuttlovkulmâ")
+      , (64, "kuttlovnelji")
+      , (65, "kuttlovvittâ")
+      , (66, "kuttlovkuttâ")
+      , (67, "kuttlovčiččâm")
+      , (68, "kuttlovkäävci")
+      , (69, "kuttlovoovce")
+      , (70, "čiččâmlov")
+      , (71, "čiččâmlovohtâ")
+      , (72, "čiččâmlovkyehti")
+      , (73, "čiččâmlovkulmâ")
+      , (74, "čiččâmlovnelji")
+      , (75, "čiččâmlovvittâ")
+      , (76, "čiččâmlovkuttâ")
+      , (77, "čiččâmlovčiččâm")
+      , (78, "čiččâmlovkäävci")
+      , (79, "čiččâmlovoovce")
+      , (80, "kähcilov")
+      , (81, "kähcilovohtâ")
+      , (82, "kähcilovkyehti")
+      , (83, "kähcilovkulmâ")
+      , (84, "kähcilovnelji")
+      , (85, "kähcilovvittâ")
+      , (86, "kähcilovkuttâ")
+      , (87, "kähcilovčiččâm")
+      , (88, "kähcilovkäävci")
+      , (89, "kähcilovoovce")
+      , (90, "ohcelov")
+      , (91, "ohcelovohtâ")
+      , (92, "ohcelovkyehti")
+      , (93, "ohcelovkulmâ")
+      , (94, "ohcelovnelji")
+      , (95, "ohcelovvittâ")
+      , (96, "ohcelovkuttâ")
+      , (97, "ohcelovčiččâm")
+      , (98, "ohcelovkäävci")
+      , (99, "ohcelovoovce")
+      , (100, "čyeđe")
+      , (101, "čyeđe ohtâ")
+      , (102, "čyeđe kyehti")
+      , (103, "čyeđe kulmâ")
+      , (104, "čyeđe nelji")
+      , (105, "čyeđe vittâ")
+      , (106, "čyeđe kuttâ")
+      , (107, "čyeđe čiččâm")
+      , (108, "čyeđe käävci")
+      , (109, "čyeđe oovce")
+      , (110, "čyeđe love")
+      , (123, "čyeđe kyehtlovkulmâ")
+      , (200, "kyehtičyeđe")
+      , (300, "kulmâčyeđe")
+      , (321, "kulmâčyeđe kyehtlovohtâ")
+      , (400, "neljičyeđe")
+      , (500, "vittâčyeđe")
+      , (600, "kuttâčyeđe")
+      , (700, "čiččâmčyeđe")
+      , (800, "käävcičyeđe")
+      , (900, "oovcečyeđe")
+      , (909, "oovcečyeđe oovce")
+      , (990, "oovcečyeđe ohcelov")
+      , (999, "oovcečyeđe ohcelovoovce")
+      , (1000, "tuhhát")
+      , (1001, "tuhhát ohtâ")
+      , (1008, "tuhhát käävci")
+      , (1234, "tuhhát kyehtičyeđe kulmâlovnelji")
+      , (2000, "kyehttuhhát")
+      , (3000, "kulmâtuhhát")
+      , (4000, "neljituhhát")
+      , (4321, "neljituhhát kulmâčyeđe kyehtlovohtâ")
+      , (5000, "vittâtuhhát")
+      , (6000, "kuttâtuhhát")
+      , (7000, "čiččâmtuhhát")
+      , (8000, "käävcituhhát")
+      , (9000, "oovcetuhhát")
+      , (10000, "love tuhhát")
+      , (12345, "kyehtnubáloh tuhhát kulmâčyeđe neljilovvittâ")
+      , (20000, "kyehtlov tuhhát")
+      , (30000, "kulmâlov tuhhát")
+      , (40000, "neljilov tuhhát")
+      , (50000, "vittlov tuhhát")
+      , (54321, "vittlovneljituhhát kulmâčyeđe kyehtlovohtâ")
+      , (60000, "kuttlov tuhhát")
+      , (70000, "čiččâmlov tuhhát")
+      , (80000, "kähcilov tuhhát")
+      , (90000, "ohcelov tuhhát")
+      , (100000, "čyeđe tuhhát")
+      , (123456, "čyeđe kyehtlovkulmâtuhhát neljičyeđe vittlovkuttâ")
+      , (200000, "kyehtičyeđe tuhhát")
+      , (300000, "kulmâčyeđe tuhhát")
+      , (400000, "neljičyeđe tuhhát")
+      , (500000, "vittâčyeđe tuhhát")
+      , (600000, "kuttâčyeđe tuhhát")
+      , (654321, "kuttâčyeđe vittlovneljituhhát kulmâčyeđe kyehtlovohtâ")
+      , (700000, "čiččâmčyeđe tuhhát")
+      , (800000, "käävcičyeđe tuhhát")
+      , (900000, "oovcečyeđe tuhhát")
+      , (1000000, "miljon")
+      , (1000001, "miljon ohtâ")
+      , (1234567, "miljon kyehtičyeđe kulmâlovneljituhhát vittâčyeđe kuttlovčiččâm")
+      , (2000000, "kyehti miljona")
+      , (3000000, "kulmâ miljona")
+      , (4000000, "nelji miljona")
+      , (5000000, "vittâ miljona")
+      , (6000000, "kuttâ miljona")
+      , (7000000, "čiččâm miljona")
+      , (7654321, "čiččâm miljona kuttâčyeđe vittlovneljituhhát kulmâčyeđe kyehtlovohtâ")
+      , (8000000, "käävci miljona")
+      , (9000000, "oovce miljona")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/SPA/TestData.hs b/src-test/Text/Numeral/Language/SPA/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/SPA/TestData.hs
@@ -0,0 +1,273 @@
+{-|
+[@ISO639-1@]        es
+
+[@ISO639-2B@]       spa
+
+[@ISO639-3@]        spa
+
+[@Native name@]     Español
+
+[@English name@]    Spanish
+-}
+
+module Text.Numeral.Language.SPA.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Prelude ( (+), Integral )
+import "numerals" Text.Numeral.Misc ( dec )
+import "numerals" Text.Numeral.Grammar
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+-- Sources:
+--   http://www.sf.airnet.ne.jp/~ts/language/number/spanish.html
+--   http://spanish.about.com/cs/forbeginners/a/cardinalnum_beg.htm
+--   http://www.learn-spanish-help.com/count-in-spanish.html
+--   http://www.donquijote.org/spanishlanguage/numbers/numbers1.asp
+--   http://en.wiktionary.org/wiki/Appendix:Spanish_numerals
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "neuter"
+    , neuter defaultInflection
+    , [ (-3, "menos tres")
+      , (-2, "menos dos")
+      , (-1, "menos uno")
+      , (0, "cero")
+      , (1, "uno")
+      , (2, "dos")
+      , (3, "tres")
+      , (4, "cuatro")
+      , (5, "cinco")
+      , (6, "seis")
+      , (7, "siete")
+      , (8, "ocho")
+      , (9, "nueve")
+      , (10, "diez")
+      , (11, "once")
+      , (12, "doce")
+      , (13, "trece")
+      , (14, "catorce")
+      , (15, "quince")
+      , (16, "dieciséis")
+      , (17, "diecisiete")
+      , (18, "dieciocho")
+      , (19, "diecinueve")
+      , (20, "veinte")
+      , (21, "veintiuno")
+      , (22, "veintidós")
+      , (23, "veintitrés")
+      , (24, "veinticuatro")
+      , (25, "veinticinco")
+      , (26, "veintiséis")
+      , (27, "veintisiete")
+      , (28, "veintiocho")
+      , (29, "veintinueve")
+      , (30, "treinta")
+      , (31, "treinta y uno")
+      , (32, "treinta y dos")
+      , (33, "treinta y tres")
+      , (34, "treinta y cuatro")
+      , (35, "treinta y cinco")
+      , (36, "treinta y seis")
+      , (37, "treinta y siete")
+      , (38, "treinta y ocho")
+      , (39, "treinta y nueve")
+      , (40, "cuarenta")
+      , (41, "cuarenta y uno")
+      , (42, "cuarenta y dos")
+      , (43, "cuarenta y tres")
+      , (44, "cuarenta y cuatro")
+      , (45, "cuarenta y cinco")
+      , (46, "cuarenta y seis")
+      , (47, "cuarenta y siete")
+      , (48, "cuarenta y ocho")
+      , (49, "cuarenta y nueve")
+      , (50, "cincuenta")
+      , (51, "cincuenta y uno")
+      , (52, "cincuenta y dos")
+      , (53, "cincuenta y tres")
+      , (54, "cincuenta y cuatro")
+      , (55, "cincuenta y cinco")
+      , (56, "cincuenta y seis")
+      , (57, "cincuenta y siete")
+      , (58, "cincuenta y ocho")
+      , (59, "cincuenta y nueve")
+      , (60, "sesenta")
+      , (61, "sesenta y uno")
+      , (62, "sesenta y dos")
+      , (63, "sesenta y tres")
+      , (64, "sesenta y cuatro")
+      , (65, "sesenta y cinco")
+      , (66, "sesenta y seis")
+      , (67, "sesenta y siete")
+      , (68, "sesenta y ocho")
+      , (69, "sesenta y nueve")
+      , (70, "setenta")
+      , (71, "setenta y uno")
+      , (72, "setenta y dos")
+      , (73, "setenta y tres")
+      , (74, "setenta y cuatro")
+      , (75, "setenta y cinco")
+      , (76, "setenta y seis")
+      , (77, "setenta y siete")
+      , (78, "setenta y ocho")
+      , (79, "setenta y nueve")
+      , (80, "ochenta")
+      , (81, "ochenta y uno")
+      , (82, "ochenta y dos")
+      , (83, "ochenta y tres")
+      , (84, "ochenta y cuatro")
+      , (85, "ochenta y cinco")
+      , (86, "ochenta y seis")
+      , (87, "ochenta y siete")
+      , (88, "ochenta y ocho")
+      , (89, "ochenta y nueve")
+      , (90, "noventa")
+      , (91, "noventa y uno")
+      , (92, "noventa y dos")
+      , (93, "noventa y tres")
+      , (94, "noventa y cuatro")
+      , (95, "noventa y cinco")
+      , (96, "noventa y seis")
+      , (97, "noventa y siete")
+      , (98, "noventa y ocho")
+      , (99, "noventa y nueve")
+      , (100, "cien")
+      , (101, "ciento uno")
+      , (103, "ciento tres")
+      , (114, "ciento catorce")
+      , (127, "ciento veintisiete")
+      , (165, "ciento sesenta y cinco")
+      , (198, "ciento noventa y ocho")
+      , (199, "ciento noventa y nueve")
+      , (200, "doscientos")
+      , (221, "doscientos veintiuno")
+      , (256, "doscientos cincuenta y seis")
+      , (300, "trescientos")
+      , (400, "cuatrocientos")
+      , (496, "cuatrocientos noventa y seis")
+      , (500, "quinientos")
+      , (512, "quinientos doce")
+      , (600, "seiscientos")
+      , (666, "seiscientos sesenta y seis")
+      , (700, "setecientos")
+      , (800, "ochocientos")
+      , (900, "novecientos")
+      , (1000, "mil")
+      , (1002, "mil dos")
+      , (1024, "mil veinticuatro")
+      , (1729, "mil setecientos veintinueve")
+      , (2000, "dos mil")
+      , (2800, "dos mil ochocientos")
+      , (3000, "tres mil")
+      , (4000, "cuatro mil")
+      , (5000, "cinco mil")
+      , (6000, "seis mil")
+      , (7000, "siete mil")
+      , (8000, "ocho mil")
+      , (9000, "nueve mil")
+      , (dec 4, "diez mil")
+      , (15000, "quince mil")
+      , (18000, "dieciocho mil")
+      , (22000, "veintidós mil")
+      , (28000, "veintiocho mil")
+      , (37000, "treinta y siete mil")
+      , (85000, "ochenta y cinco mil")
+      , (dec 5, "cien mil")
+      , (108000, "ciento ocho mil")
+      , (160000, "ciento sesenta mil")
+      , (585000, "quinientos ochenta y cinco mil")
+      , (999000, "novecientos noventa y nueve mil")
+      , (dec 6, "un millón")
+      , (dec 6 + 1, "un millón uno")
+      , (21 * dec 6 + 21, "veintiún millones veintiuno")
+      , (500 * dec 6, "quinientos millones")
+      , (521 * dec 6 + 1, "quinientos veintiún millones uno")
+      , (dec 7, "diez millones")
+      , (dec 8, "cien millones")
+      , (dec 9, "mil millones")
+      , (dec 10, "diez mil millones")
+      , (dec 11, "cien mil millones")
+      , (dec 12, "un billón")
+      , (dec 18, "un trillón")
+      , (dec 24, "un cuatrillón")
+      , (15936535897932384626433832795, "quince mil novecientos treinta y seis cuatrillones quinientos treinta y cinco mil ochocientos noventa y siete trillones novecientos treinta y dos mil trescientos ochenta y cuatro billones seiscientos veintiséis mil cuatrocientos treinta y tres millones ochocientos treinta y dos mil setecientos noventa y cinco")
+      , (dec 30, "un quintillón")
+      , (31415926535897932384626433832795, "treinta y un quintillones cuatrocientos quince mil novecientos veintiséis cuatrillones quinientos treinta y cinco mil ochocientos noventa y siete trillones novecientos treinta y dos mil trescientos ochenta y cuatro billones seiscientos veintiséis mil cuatrocientos treinta y tres millones ochocientos treinta y dos mil setecientos noventa y cinco")
+      , (dec 36, "un sextillón")
+      , (dec 42, "un septillón")
+      , (dec 48, "un octillón")
+      , (dec 54, "un nonillón")
+      , (dec 60, "un decillón")
+      , (dec 66, "un undecillón")
+      , (dec 72, "un duodecillón")
+      , (dec 78, "un tredecillón")
+      , (dec 84, "un cuatordecillón")
+      , (dec 90, "un quindecillón")
+      , (dec 96, "un sexdecillón")
+      , (dec 102, "un septendecillón")
+      , (dec 108, "un octodecillón")
+      , (dec 114, "un novendecillón")
+      , (dec 120, "un vigintillón")
+      ]
+    )
+  , ( "feminine"
+    , feminine defaultInflection
+    , [ (1, "una")
+      , (11, "once")
+      , (21, "veintiuna")
+      , (31, "treinta y una")
+      , (41, "cuarenta y una")
+      , (51, "cincuenta y una")
+      , (61, "sesenta y una")
+      , (71, "setenta y una")
+      , (81, "ochenta y una")
+      , (91, "noventa y una")
+      , (100, "cien")
+      , (101, "ciento una")
+      , (200, "doscientas")
+      , (221, "doscientas veintiuna")
+      , (300, "trescientas")
+      , (400, "cuatrocientas")
+      , (500, "quinientas")
+      , (600, "seiscientas")
+      , (700, "setecientas")
+      , (800, "ochocientas")
+      , (900, "novecientas")
+      , (dec 6, "un millón")
+      , (dec 6 + 1, "un millón una")
+      , (21 * dec 6 + 21, "veintiún millones veintiuna")
+      ]
+    )
+  , ( "masculine"
+    , masculine defaultInflection
+    , [ (1, "un")
+      , (11, "once")
+      , (21, "veintiún")
+      , (31, "treinta y un")
+      , (41, "cuarenta y un")
+      , (51, "cincuenta y un")
+      , (61, "sesenta y un")
+      , (71, "setenta y un")
+      , (81, "ochenta y un")
+      , (91, "noventa y un")
+      , (100, "cien")
+      , (101, "ciento un")
+      , (200, "doscientos")
+      , (221, "doscientos veintiún")
+      , (dec 6, "un millón")
+      , (dec 6 + 1, "un millón un")
+      , (21 * dec 6 + 21, "veintiún millones veintiún")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/SV/TestData.hs b/src-test/Text/Numeral/Language/SV/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/SV/TestData.hs
+++ /dev/null
@@ -1,308 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        sv
-
-[@ISO639-2B@]       swe
-
-[@ISO639-3@]        swe
-
-[@Native name@]     svenska
-
-[@English name@]    Swedish
--}
-
-module Text.Numeral.Language.SV.TestData
-    ( cardinals
-    , ordinals
-    , partitives
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Prelude.Unicode ( (⋅) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Grammar ( neuter, common )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
--- Sources:
---   http://en.wikipedia.org/wiki/Swedish_grammar#Numerals
---   http://publications.europa.eu/code/sv/sv-4100600sv.htm
---   http://www.lysator.liu.se/language/Languages/Swedish/Grammar.html#numbers
---   http://en.wikibooks.org/wiki/Swedish/Numerals
---   http://www.speakswedish.co.uk/vocab/numbers
---   http://aclweb.org/anthology/C/C73/C73-2031.pdf
---
--- Rules for writing large words seem hard to come by online.
--- http://publications.europa.eu/code/sv/sv-4100600sv.htm provides
--- some guidelines:
---
--- Rule 1: Even hundreds, thousands, and so on, are generally written
--- as two words: två tusen, fyra hundra, sex miljoner
---
--- Rule 2: Numbers smaller than one hundred are always written as one
--- word, as are other number under one million: fyrtiosju,
--- niotusenfemhundrasexton
---
--- Rule 3: Numbers larger than one million should be written so that
--- the words tusen, miljon, miljard, and so on always stand on their
--- own: tjugofem miljarder tre miljoner
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "neuter"
-    , neuter defaultInflection
-      -- Rule 2 (one word)
-    , [ (0, "noll")
-      , (1, "ett")
-      , (2, "två")
-      , (3, "tre")
-      , (4, "fyra")
-      , (5, "fem")
-      , (6, "sex")
-      , (7, "sju")
-      , (8, "åtta")
-      , (9, "nio")
-      , (10, "tio")
-      , (11, "elva")
-      , (12, "tolv")
-      , (13, "tretton")
-      , (14, "fjorton")
-      , (15, "femton")
-      , (16, "sexton")
-      , (17, "sjutton")
-      , (18, "arton")
-      , (19, "nitton")
-      , (20, "tjugo")
-      , (21, "tjugoett")
-      , (22, "tjugotvå")
-      , (23, "tjugotre")
-      , (24, "tjugofyra")
-      , (25, "tjugofem")
-      , (26, "tjugosex")
-      , (27, "tjugosju")
-      , (28, "tjugoåtta")
-      , (29, "tjugonio")
-      , (30, "trettio")
-      , (31, "trettioett")
-      , (32, "trettiotvå")
-      , (33, "trettiotre")
-      , (34, "trettiofyra")
-      , (35, "trettiofem")
-      , (36, "trettiosex")
-      , (37, "trettiosju")
-      , (38, "trettioåtta")
-      , (39, "trettionio")
-      , (40, "fyrtio")
-      , (41, "fyrtioett")
-      , (42, "fyrtiotvå")
-      , (43, "fyrtiotre")
-      , (44, "fyrtiofyra")
-      , (45, "fyrtiofem")
-      , (46, "fyrtiosex")
-      , (47, "fyrtiosju")
-      , (48, "fyrtioåtta")
-      , (49, "fyrtionio")
-      , (50, "femtio")
-      , (51, "femtioett")
-      , (52, "femtiotvå")
-      , (53, "femtiotre")
-      , (54, "femtiofyra")
-      , (55, "femtiofem")
-      , (56, "femtiosex")
-      , (57, "femtiosju")
-      , (58, "femtioåtta")
-      , (59, "femtionio")
-      , (60, "sextio")
-      , (61, "sextioett")
-      , (62, "sextiotvå")
-      , (63, "sextiotre")
-      , (64, "sextiofyra")
-      , (65, "sextiofem")
-      , (66, "sextiosex")
-      , (67, "sextiosju")
-      , (68, "sextioåtta")
-      , (69, "sextionio")
-      , (70, "sjuttio")
-      , (71, "sjuttioett")
-      , (72, "sjuttiotvå")
-      , (73, "sjuttiotre")
-      , (74, "sjuttiofyra")
-      , (75, "sjuttiofem")
-      , (76, "sjuttiosex")
-      , (77, "sjuttiosju")
-      , (78, "sjuttioåtta")
-      , (79, "sjuttionio")
-      , (80, "åttio")
-      , (81, "åttioett")
-      , (82, "åttiotvå")
-      , (83, "åttiotre")
-      , (84, "åttiofyra")
-      , (85, "åttiofem")
-      , (86, "åttiosex")
-      , (87, "åttiosju")
-      , (88, "åttioåtta")
-      , (89, "åttionio")
-      , (90, "nittio")
-      , (91, "nittioett")
-      , (92, "nittiotvå")
-      , (93, "nittiotre")
-      , (94, "nittiofyra")
-      , (95, "nittiofem")
-      , (96, "nittiosex")
-      , (97, "nittiosju")
-      , (98, "nittioåtta")
-      , (99, "nittionio")
-      , (101, "etthundraett")
-      , (102, "etthundratvå")
-      , (549, "femhundrafyrtionio")
-        -- "ettusen" is a special spelling case where "ett tusen"
-        -- written as one word becomes ettusen, dropping one 't'.
-      , (1349, "ettusentrehundrafyrtionio")
-      , (3502, "tretusenfemhundratvå")
-      , (9516, "niotusenfemhundrasexton")
-      , (30934, "trettiotusenniohundratrettiofyra")
-      , (837132, "åttahundratrettiosjutusenetthundratrettiotvå")
-      , (999999, "niohundranittioniotusenniohundranittionio")
-        -- Rule 1 (even hundreds and so on)
-      , (100, "ett hundra")
-      , (200, "två hundra")
-      , (300, "tre hundra")
-      , (500, "fem hundra")
-      , (600, "sex hundra")
-      , (800, "åtta hundra")
-      , (1000, "ett tusen")
-      , (3000, "tre tusen")
-      , (5000, "fem tusen")
-      , (10000, "tio tusen")
-      , (20000, "tjugo tusen")
-      , (50000, "femtio tusen")
-      , (dec 5, "etthundra tusen")
-      , (dec 6, "en miljon")
-      , (2 ⋅ dec 6, "två miljoner")
-      , (10 ⋅ dec 6, "tio miljoner")
-      , (dec 8, "etthundra miljoner")
-      , (2 ⋅ dec 8, "tvåhundra miljoner")
-      , (dec 9, "en miljard")
-      , (dec 12, "en biljon")
-      , (dec 15, "en biljard")
-      , (dec 18, "en triljon")
-      , (dec 24, "en kvadriljon")
-      , (dec 30, "en kvintiljon")
-      , (dec 36, "en sextiljon")
-      , (dec 42, "en septiljon")
-      , (dec 48, "en oktiljon")
-      , (dec 54, "en noniljon")
-      , (dec 60, "en deciljon")
-      , (dec 66, "en undeciljon")
-        -- Rule 3: Numbers larger than one million split up on tusen, miljon, etc
-      , (123456789, "etthundratjugotre miljoner fyrahundrafemtiosex tusen sjuhundraåttionio")
-      , (37149204, "trettiosju miljoner etthundrafyrtionio tusen tvåhundrafyra")
-      , (302145568, "trehundratvå miljoner etthundrafyrtiofem tusen femhundrasextioåtta")
-      , (1000100, "en miljon etthundra")
-      , (1305100, "en miljon trehundrafem tusen etthundra")
-      , (300000102, "trehundra miljoner etthundratvå")
-      , (300500000, "trehundra miljoner femhundra tusen")
-      , (25003000000, "tjugofem miljarder tre miljoner")
-      ]
-    )
-  , ( "common"
-    , common defaultInflection
-    , [ (1, "en")
-      , (21, "tjugoen")
-      ]
-    )
-  ]
-
-ordinals ∷ (Integral i) ⇒ TestData i
-ordinals =
-  [ ( "neuter"
-    , neuter defaultInflection
-    , [ (0, "nollte")
-      , (1, "första")
-      , (2, "andra")
-      , (3, "tredje")
-      , (4, "fjärde")
-      , (5, "femte")
-      , (6, "sjätte")
-      , (7, "sjunde")
-      , (8, "åttonde")
-      , (9, "nionde")
-      , (10, "tionde")
-      , (11, "elfte")
-      , (12, "tolfte")
-      , (13, "trettonde")
-      , (14, "fjortonde")
-      , (15, "femtonde")
-      , (16, "sextonde")
-      , (17, "sjuttonde")
-      , (18, "artonde")
-      , (19, "nittonde")
-      , (20, "tjugonde")
-      , (21, "tjugoförsta")
-      , (22, "tjugoandra")
-      , (23, "tjugotredje")
-      , (30, "trettionde")
-      , (40, "fyrtionde")
-      , (50, "femtionde")
-      , (60, "sextionde")
-      , (70, "sjuttionde")
-      , (80, "åttionde")
-      , (90, "nittionde")
-      , (100, "ett hundrade")
-      , (200, "två hundrade")
-      , (500, "fem hundrade")
-      , (1000, "ett tusende")
-      , (2000, "två tusende")
-      , (5000, "fem tusende")
-      , (10000, "tio tusende")
-      , (20000, "tjugo tusende")
-      , (50000, "femtio tusende")
-      , (dec 6, "en miljonte")
-      , (dec 9, "en miljarte")
-      , (dec 12, "en biljonte")
-      , (dec 18, "en triljonte")
-      ]
-    )
-  ]
-
-partitives ∷ (Integral i) ⇒ TestData (i, i)
-partitives =
-  [ ( "default"
-    , defaultInflection
-    , [ ((1, 2), "en halv")
-      , ((1, 3), "en tredjedel")
-      , ((3, 4), "tre fjärdedelar")
-      , ((2, 5), "två femtedelar")
-      , ((5, 6), "fem sjättedelar")
-      , ((4, 7), "fyra sjundedelar")
-      , ((1, 8), "en åttondel")
-      , ((8, 9), "åtta niondelar")
-      , ((1, 10), "en tiondel")
-      , ((1, 11), "en elftedel")
-      , ((1, 12), "en tolftedel")
-      , ((1, 13), "en trettondel")
-      , ((1, 14), "en fjortondel")
-      , ((1, 15), "en femtondel")
-      , ((1, 16), "en sextondel")
-      , ((1, 17), "en sjuttondel")
-      , ((1, 18), "en artondel")
-      , ((1, 19), "en nittondel")
-      , ((1, 20), "en tjugondel")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/SWE/TestData.hs b/src-test/Text/Numeral/Language/SWE/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/SWE/TestData.hs
@@ -0,0 +1,300 @@
+{-|
+[@ISO639-1@]        sv
+
+[@ISO639-2B@]       swe
+
+[@ISO639-3@]        swe
+
+[@Native name@]     svenska
+
+[@English name@]    Swedish
+-}
+
+module Text.Numeral.Language.SWE.TestData
+    ( cardinals
+    , ordinals
+    , partitives
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( neuter, common )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+-- Sources:
+--   http://en.wikipedia.org/wiki/Swedish_grammar#Numerals
+--   http://publications.europa.eu/code/sv/sv-4100600sv.htm
+--   http://www.lysator.liu.se/language/Languages/Swedish/Grammar.html#numbers
+--   http://en.wikibooks.org/wiki/Swedish/Numerals
+--   http://www.speakswedish.co.uk/vocab/numbers
+--   http://aclweb.org/anthology/C/C73/C73-2031.pdf
+--
+-- Rules for writing large words seem hard to come by online.
+-- http://publications.europa.eu/code/sv/sv-4100600sv.htm provides
+-- some guidelines:
+--
+-- Rule 1: Even hundreds, thousands, and so on, are generally written
+-- as two words: två tusen, fyra hundra, sex miljoner
+--
+-- Rule 2: Numbers smaller than one hundred are always written as one
+-- word, as are other number under one million: fyrtiosju,
+-- niotusenfemhundrasexton
+--
+-- Rule 3: Numbers larger than one million should be written so that
+-- the words tusen, miljon, miljard, and so on always stand on their
+-- own: tjugofem miljarder tre miljoner
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "neuter"
+    , neuter defaultInflection
+      -- Rule 2 (one word)
+    , [ (0, "noll")
+      , (1, "ett")
+      , (2, "två")
+      , (3, "tre")
+      , (4, "fyra")
+      , (5, "fem")
+      , (6, "sex")
+      , (7, "sju")
+      , (8, "åtta")
+      , (9, "nio")
+      , (10, "tio")
+      , (11, "elva")
+      , (12, "tolv")
+      , (13, "tretton")
+      , (14, "fjorton")
+      , (15, "femton")
+      , (16, "sexton")
+      , (17, "sjutton")
+      , (18, "arton")
+      , (19, "nitton")
+      , (20, "tjugo")
+      , (21, "tjugoett")
+      , (22, "tjugotvå")
+      , (23, "tjugotre")
+      , (24, "tjugofyra")
+      , (25, "tjugofem")
+      , (26, "tjugosex")
+      , (27, "tjugosju")
+      , (28, "tjugoåtta")
+      , (29, "tjugonio")
+      , (30, "trettio")
+      , (31, "trettioett")
+      , (32, "trettiotvå")
+      , (33, "trettiotre")
+      , (34, "trettiofyra")
+      , (35, "trettiofem")
+      , (36, "trettiosex")
+      , (37, "trettiosju")
+      , (38, "trettioåtta")
+      , (39, "trettionio")
+      , (40, "fyrtio")
+      , (41, "fyrtioett")
+      , (42, "fyrtiotvå")
+      , (43, "fyrtiotre")
+      , (44, "fyrtiofyra")
+      , (45, "fyrtiofem")
+      , (46, "fyrtiosex")
+      , (47, "fyrtiosju")
+      , (48, "fyrtioåtta")
+      , (49, "fyrtionio")
+      , (50, "femtio")
+      , (51, "femtioett")
+      , (52, "femtiotvå")
+      , (53, "femtiotre")
+      , (54, "femtiofyra")
+      , (55, "femtiofem")
+      , (56, "femtiosex")
+      , (57, "femtiosju")
+      , (58, "femtioåtta")
+      , (59, "femtionio")
+      , (60, "sextio")
+      , (61, "sextioett")
+      , (62, "sextiotvå")
+      , (63, "sextiotre")
+      , (64, "sextiofyra")
+      , (65, "sextiofem")
+      , (66, "sextiosex")
+      , (67, "sextiosju")
+      , (68, "sextioåtta")
+      , (69, "sextionio")
+      , (70, "sjuttio")
+      , (71, "sjuttioett")
+      , (72, "sjuttiotvå")
+      , (73, "sjuttiotre")
+      , (74, "sjuttiofyra")
+      , (75, "sjuttiofem")
+      , (76, "sjuttiosex")
+      , (77, "sjuttiosju")
+      , (78, "sjuttioåtta")
+      , (79, "sjuttionio")
+      , (80, "åttio")
+      , (81, "åttioett")
+      , (82, "åttiotvå")
+      , (83, "åttiotre")
+      , (84, "åttiofyra")
+      , (85, "åttiofem")
+      , (86, "åttiosex")
+      , (87, "åttiosju")
+      , (88, "åttioåtta")
+      , (89, "åttionio")
+      , (90, "nittio")
+      , (91, "nittioett")
+      , (92, "nittiotvå")
+      , (93, "nittiotre")
+      , (94, "nittiofyra")
+      , (95, "nittiofem")
+      , (96, "nittiosex")
+      , (97, "nittiosju")
+      , (98, "nittioåtta")
+      , (99, "nittionio")
+      , (101, "etthundraett")
+      , (102, "etthundratvå")
+      , (549, "femhundrafyrtionio")
+        -- "ettusen" is a special spelling case where "ett tusen"
+        -- written as one word becomes ettusen, dropping one 't'.
+      , (1349, "ettusentrehundrafyrtionio")
+      , (3502, "tretusenfemhundratvå")
+      , (9516, "niotusenfemhundrasexton")
+      , (30934, "trettiotusenniohundratrettiofyra")
+      , (837132, "åttahundratrettiosjutusenetthundratrettiotvå")
+      , (999999, "niohundranittioniotusenniohundranittionio")
+        -- Rule 1 (even hundreds and so on)
+      , (100, "ett hundra")
+      , (200, "två hundra")
+      , (300, "tre hundra")
+      , (500, "fem hundra")
+      , (600, "sex hundra")
+      , (800, "åtta hundra")
+      , (1000, "ett tusen")
+      , (3000, "tre tusen")
+      , (5000, "fem tusen")
+      , (10000, "tio tusen")
+      , (20000, "tjugo tusen")
+      , (50000, "femtio tusen")
+      , (dec 5, "etthundra tusen")
+      , (dec 6, "en miljon")
+      , (2 * dec 6, "två miljoner")
+      , (10 * dec 6, "tio miljoner")
+      , (dec 8, "etthundra miljoner")
+      , (2 * dec 8, "tvåhundra miljoner")
+      , (dec 9, "en miljard")
+      , (dec 12, "en biljon")
+      , (dec 15, "en biljard")
+      , (dec 18, "en triljon")
+      , (dec 24, "en kvadriljon")
+      , (dec 30, "en kvintiljon")
+      , (dec 36, "en sextiljon")
+      , (dec 42, "en septiljon")
+      , (dec 48, "en oktiljon")
+      , (dec 54, "en noniljon")
+      , (dec 60, "en deciljon")
+      , (dec 66, "en undeciljon")
+        -- Rule 3: Numbers larger than one million split up on tusen, miljon, etc
+      , (123456789, "etthundratjugotre miljoner fyrahundrafemtiosex tusen sjuhundraåttionio")
+      , (37149204, "trettiosju miljoner etthundrafyrtionio tusen tvåhundrafyra")
+      , (302145568, "trehundratvå miljoner etthundrafyrtiofem tusen femhundrasextioåtta")
+      , (1000100, "en miljon etthundra")
+      , (1305100, "en miljon trehundrafem tusen etthundra")
+      , (300000102, "trehundra miljoner etthundratvå")
+      , (300500000, "trehundra miljoner femhundra tusen")
+      , (25003000000, "tjugofem miljarder tre miljoner")
+      ]
+    )
+  , ( "common"
+    , common defaultInflection
+    , [ (1, "en")
+      , (21, "tjugoen")
+      ]
+    )
+  ]
+
+ordinals :: (Integral i) => TestData i
+ordinals =
+  [ ( "neuter"
+    , neuter defaultInflection
+    , [ (0, "nollte")
+      , (1, "första")
+      , (2, "andra")
+      , (3, "tredje")
+      , (4, "fjärde")
+      , (5, "femte")
+      , (6, "sjätte")
+      , (7, "sjunde")
+      , (8, "åttonde")
+      , (9, "nionde")
+      , (10, "tionde")
+      , (11, "elfte")
+      , (12, "tolfte")
+      , (13, "trettonde")
+      , (14, "fjortonde")
+      , (15, "femtonde")
+      , (16, "sextonde")
+      , (17, "sjuttonde")
+      , (18, "artonde")
+      , (19, "nittonde")
+      , (20, "tjugonde")
+      , (21, "tjugoförsta")
+      , (22, "tjugoandra")
+      , (23, "tjugotredje")
+      , (30, "trettionde")
+      , (40, "fyrtionde")
+      , (50, "femtionde")
+      , (60, "sextionde")
+      , (70, "sjuttionde")
+      , (80, "åttionde")
+      , (90, "nittionde")
+      , (100, "ett hundrade")
+      , (200, "två hundrade")
+      , (500, "fem hundrade")
+      , (1000, "ett tusende")
+      , (2000, "två tusende")
+      , (5000, "fem tusende")
+      , (10000, "tio tusende")
+      , (20000, "tjugo tusende")
+      , (50000, "femtio tusende")
+      , (dec 6, "en miljonte")
+      , (dec 9, "en miljarte")
+      , (dec 12, "en biljonte")
+      , (dec 18, "en triljonte")
+      ]
+    )
+  ]
+
+partitives :: (Integral i) => TestData (i, i)
+partitives =
+  [ ( "default"
+    , defaultInflection
+    , [ ((1, 2), "en halv")
+      , ((1, 3), "en tredjedel")
+      , ((3, 4), "tre fjärdedelar")
+      , ((2, 5), "två femtedelar")
+      , ((5, 6), "fem sjättedelar")
+      , ((4, 7), "fyra sjundedelar")
+      , ((1, 8), "en åttondel")
+      , ((8, 9), "åtta niondelar")
+      , ((1, 10), "en tiondel")
+      , ((1, 11), "en elftedel")
+      , ((1, 12), "en tolftedel")
+      , ((1, 13), "en trettondel")
+      , ((1, 14), "en fjortondel")
+      , ((1, 15), "en femtondel")
+      , ((1, 16), "en sextondel")
+      , ((1, 17), "en sjuttondel")
+      , ((1, 18), "en artondel")
+      , ((1, 19), "en nittondel")
+      , ((1, 20), "en tjugondel")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/TAR/TestData.hs b/src-test/Text/Numeral/Language/TAR/TestData.hs
--- a/src-test/Text/Numeral/Language/TAR/TestData.hs
+++ b/src-test/Text/Numeral/Language/TAR/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -36,7 +30,7 @@
   http://lingweb.eva.mpg.de/numeral/Tarahumara-Central.htm
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
@@ -121,16 +115,16 @@
       , (79, "quicháosa macoy miná químacoy")
         -- The "osá naósa" is from Lowland Tarahumara, not Central
         -- Tarahumara. But this is the only available source.
-      , (80, "osá naósa macoy")
-      , (81, "osá naósa macoy miná biré")
-      , (82, "osá naósa macoy miná ocuá")
-      , (83, "osá naósa macoy miná biquiyá")
-      , (84, "osá naósa macoy miná nahuosa")
-      , (85, "osá naósa macoy miná marí")
-      , (86, "osá naósa macoy miná usani")
-      , (87, "osá naósa macoy miná quicháo")
-      , (88, "osá naósa macoy miná osá nahuó")
-      , (89, "osá naósa macoy miná químacoy")
+      , (80, "osá nahuosa macoy")
+      , (81, "osá nahuosa macoy miná biré")
+      , (82, "osá nahuosa macoy miná ocuá")
+      , (83, "osá nahuosa macoy miná biquiyá")
+      , (84, "osá nahuosa macoy miná nahuosa")
+      , (85, "osá nahuosa macoy miná marí")
+      , (86, "osá nahuosa macoy miná usani")
+      , (87, "osá nahuosa macoy miná quicháo")
+      , (88, "osá nahuosa macoy miná osá nahuó")
+      , (89, "osá nahuosa macoy miná químacoy")
       , (90, "que macoisa macoy")
       , (91, "que macoisa macoy miná biré")
       , (92, "que macoisa macoy miná ocuá")
diff --git a/src-test/Text/Numeral/Language/TGS/TestData.hs b/src-test/Text/Numeral/Language/TGS/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/TGS/TestData.hs
@@ -0,0 +1,161 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        tgs
+
+[@Native name@]     -
+
+[@English name@]    Nume
+-}
+module Text.Numeral.Language.TGS.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-nume/en/tgs/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "tuwal")
+      , (2, "i-ru")
+      , (3, "i-tol")
+      , (4, "i-βet")
+      , (5, "tiβi-lim")
+      , (6, "leβe-te")
+      , (7, "leβe-ru")
+      , (8, "leβe-tol")
+      , (9, "leβe-βet")
+      , (10, "sanuβul tuwal")
+      , (11, "sanuβul tuwal ndi win tuwal")
+      , (12, "sanuβul tuwal ndi win ti-ru")
+      , (13, "sanuβul tuwal ndi win ti-tol")
+      , (14, "sanuβul tuwal ndi win ti-βet")
+      , (15, "sanuβul tuwal ndi win tiβi-lim")
+      , (16, "sanuβul tuwal ndi win ti-leβe-te")
+      , (17, "sanuβul tuwal ndi win ti-leβe-ru")
+      , (18, "sanuβul tuwal ndi win ti-leβe-tol")
+      , (19, "sanuβul tuwal ndi win ti-leβe-βet")
+      , (20, "sanuβul ru")
+      , (21, "sanuβul ru ndi win tuwal")
+      , (22, "sanuβul ru ndi win ti-ru")
+      , (23, "sanuβul ru ndi win ti-tol")
+      , (24, "sanuβul ru ndi win ti-βet")
+      , (25, "sanuβul ru ndi win tiβi-lim")
+      , (26, "sanuβul ru ndi win ti-leβe-te")
+      , (27, "sanuβul ru ndi win ti-leβe-ru")
+      , (28, "sanuβul ru ndi win ti-leβe-tol")
+      , (29, "sanuβul ru ndi win ti-leβe-βet")
+      , (30, "sanuβul tol")
+      , (31, "sanuβul tol ndi win tuwal")
+      , (32, "sanuβul tol ndi win ti-ru")
+      , (33, "sanuβul tol ndi win ti-tol")
+      , (34, "sanuβul tol ndi win ti-βet")
+      , (35, "sanuβul tol ndi win tiβi-lim")
+      , (36, "sanuβul tol ndi win ti-leβe-te")
+      , (37, "sanuβul tol ndi win ti-leβe-ru")
+      , (38, "sanuβul tol ndi win ti-leβe-tol")
+      , (39, "sanuβul tol ndi win ti-leβe-βet")
+      , (40, "sanuβul βet")
+      , (41, "sanuβul βet ndi win tuwal")
+      , (42, "sanuβul βet ndi win ti-ru")
+      , (43, "sanuβul βet ndi win ti-tol")
+      , (44, "sanuβul βet ndi win ti-βet")
+      , (45, "sanuβul βet ndi win tiβi-lim")
+      , (46, "sanuβul βet ndi win ti-leβe-te")
+      , (47, "sanuβul βet ndi win ti-leβe-ru")
+      , (48, "sanuβul βet ndi win ti-leβe-tol")
+      , (49, "sanuβul βet ndi win ti-leβe-βet")
+      , (50, "sanuβul tiβi-lim")
+      , (51, "sanuβul tiβi-lim ndi win tuwal")
+      , (52, "sanuβul tiβi-lim ndi win ti-ru")
+      , (53, "sanuβul tiβi-lim ndi win ti-tol")
+      , (54, "sanuβul tiβi-lim ndi win ti-βet")
+      , (55, "sanuβul tiβi-lim ndi win tiβi-lim")
+      , (56, "sanuβul tiβi-lim ndi win ti-leβe-te")
+      , (57, "sanuβul tiβi-lim ndi win ti-leβe-ru")
+      , (58, "sanuβul tiβi-lim ndi win ti-leβe-tol")
+      , (59, "sanuβul tiβi-lim ndi win ti-leβe-βet")
+      , (60, "sanuβul leβe-te")
+      , (61, "sanuβul leβe-te ndi win tuwal")
+      , (62, "sanuβul leβe-te ndi win ti-ru")
+      , (63, "sanuβul leβe-te ndi win ti-tol")
+      , (64, "sanuβul leβe-te ndi win ti-βet")
+      , (65, "sanuβul leβe-te ndi win tiβi-lim")
+      , (66, "sanuβul leβe-te ndi win ti-leβe-te")
+      , (67, "sanuβul leβe-te ndi win ti-leβe-ru")
+      , (68, "sanuβul leβe-te ndi win ti-leβe-tol")
+      , (69, "sanuβul leβe-te ndi win ti-leβe-βet")
+      , (70, "sanuβul leβe-ru")
+      , (71, "sanuβul leβe-ru ndi win tuwal")
+      , (72, "sanuβul leβe-ru ndi win ti-ru")
+      , (73, "sanuβul leβe-ru ndi win ti-tol")
+      , (74, "sanuβul leβe-ru ndi win ti-βet")
+      , (75, "sanuβul leβe-ru ndi win tiβi-lim")
+      , (76, "sanuβul leβe-ru ndi win ti-leβe-te")
+      , (77, "sanuβul leβe-ru ndi win ti-leβe-ru")
+      , (78, "sanuβul leβe-ru ndi win ti-leβe-tol")
+      , (79, "sanuβul leβe-ru ndi win ti-leβe-βet")
+      , (80, "sanuβul leβe-tol")
+      , (81, "sanuβul leβe-tol ndi win tuwal")
+      , (82, "sanuβul leβe-tol ndi win ti-ru")
+      , (83, "sanuβul leβe-tol ndi win ti-tol")
+      , (84, "sanuβul leβe-tol ndi win ti-βet")
+      , (85, "sanuβul leβe-tol ndi win tiβi-lim")
+      , (86, "sanuβul leβe-tol ndi win ti-leβe-te")
+      , (87, "sanuβul leβe-tol ndi win ti-leβe-ru")
+      , (88, "sanuβul leβe-tol ndi win ti-leβe-tol")
+      , (89, "sanuβul leβe-tol ndi win ti-leβe-βet")
+      , (90, "sanuβul leβe-βet")
+      , (91, "sanuβul leβe-βet ndi win tuwal")
+      , (92, "sanuβul leβe-βet ndi win ti-ru")
+      , (93, "sanuβul leβe-βet ndi win ti-tol")
+      , (94, "sanuβul leβe-βet ndi win ti-βet")
+      , (95, "sanuβul leβe-βet ndi win tiβi-lim")
+      , (96, "sanuβul leβe-βet ndi win ti-leβe-te")
+      , (97, "sanuβul leβe-βet ndi win ti-leβe-ru")
+      , (98, "sanuβul leβe-βet ndi win ti-leβe-tol")
+      , (99, "sanuβul leβe-βet ndi win ti-leβe-βet")
+      , (100, "muweldul")
+      , (101, "muweldul ndi win tuwal")
+      , (102, "muweldul ndi win ti-ru")
+      , (103, "muweldul ndi win ti-tol")
+      , (104, "muweldul ndi win ti-βet")
+      , (105, "muweldul ndi win tiβi-lim")
+      , (106, "muweldul ndi win ti-leβe-te")
+      , (107, "muweldul ndi win ti-leβe-ru")
+      , (108, "muweldul ndi win ti-leβe-tol")
+      , (109, "muweldul ndi win ti-leβe-βet")
+      , (110, "muweldul sanuβul tuwal")
+      , (123, "muweldul sanuβul ru ndi win ti-tol")
+      , (200, "muweldul i-ru")
+      , (300, "muweldul i-tol")
+      , (321, "muweldul i-tol sanuβul ru ndi win tuwal")
+      , (400, "muweldul i-βet")
+      , (500, "muweldul tiβi-lim")
+      , (600, "muweldul leβe-te")
+      , (700, "muweldul leβe-ru")
+      , (800, "muweldul leβe-tol")
+      , (900, "muweldul leβe-βet")
+      , (909, "muweldul leβe-βet ndi win ti-leβe-βet")
+      , (990, "muweldul leβe-βet sanuβul leβe-βet")
+      , (999, "muweldul leβe-βet sanuβul leβe-βet ndi win ti-leβe-βet")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/TR/TestData.hs b/src-test/Text/Numeral/Language/TR/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/TR/TestData.hs
+++ /dev/null
@@ -1,262 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        tr
-
-[@ISO639-2@]        tur
-
-[@ISO639-3@]        tur
-
-[@Native name@]     Türkçe
-
-[@English name@]    Turkish
--}
-
-module Text.Numeral.Language.TR.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.languagesandnumbers.com/how-to-count-in-turkish/en/tur/
-  http://www.sf.airnet.ne.jp/~ts/language/number/turkish.html
-  http://www.turkishlanguage.co.uk/seasons.htm#article_15
-  http://www.turkeytravelplanner.com/details/LanguageGuide/100words_lessons/100Words_10.html
-  http://en.wikibooks.org/wiki/Turkish/Numbers
-  http://tr.wikipedia.org/wiki/B%C3%BCy%C3%BCk_say%C4%B1lar%C4%B1n_adlar%C4%B1
--}
-
-cardinals ∷ (Integral i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "sıfır")
-      , (1, "bir")
-      , (2, "iki")
-      , (3, "üç")
-      , (4, "dört")
-      , (5, "beş")
-      , (6, "altı")
-      , (7, "yedi")
-      , (8, "sekiz")
-      , (9, "dokuz")
-      , (10, "on")
-      , (11, "on bir")
-      , (12, "on iki")
-      , (13, "on üç")
-      , (14, "on dört")
-      , (15, "on beş")
-      , (16, "on altı")
-      , (17, "on yedi")
-      , (18, "on sekiz")
-      , (19, "on dokuz")
-      , (20, "yirmi")
-      , (21, "yirmi bir")
-      , (22, "yirmi iki")
-      , (23, "yirmi üç")
-      , (24, "yirmi dört")
-      , (25, "yirmi beş")
-      , (26, "yirmi altı")
-      , (27, "yirmi yedi")
-      , (28, "yirmi sekiz")
-      , (29, "yirmi dokuz")
-      , (30, "otuz")
-      , (31, "otuz bir")
-      , (32, "otuz iki")
-      , (33, "otuz üç")
-      , (34, "otuz dört")
-      , (35, "otuz beş")
-      , (36, "otuz altı")
-      , (37, "otuz yedi")
-      , (38, "otuz sekiz")
-      , (39, "otuz dokuz")
-      , (40, "kırk")
-      , (41, "kırk bir")
-      , (42, "kırk iki")
-      , (43, "kırk üç")
-      , (44, "kırk dört")
-      , (45, "kırk beş")
-      , (46, "kırk altı")
-      , (47, "kırk yedi")
-      , (48, "kırk sekiz")
-      , (49, "kırk dokuz")
-      , (50, "elli")
-      , (51, "elli bir")
-      , (52, "elli iki")
-      , (53, "elli üç")
-      , (54, "elli dört")
-      , (55, "elli beş")
-      , (56, "elli altı")
-      , (57, "elli yedi")
-      , (58, "elli sekiz")
-      , (59, "elli dokuz")
-      , (60, "altmış")
-      , (61, "altmış bir")
-      , (62, "altmış iki")
-      , (63, "altmış üç")
-      , (64, "altmış dört")
-      , (65, "altmış beş")
-      , (66, "altmış altı")
-      , (67, "altmış yedi")
-      , (68, "altmış sekiz")
-      , (69, "altmış dokuz")
-      , (70, "yetmiş")
-      , (71, "yetmiş bir")
-      , (72, "yetmiş iki")
-      , (73, "yetmiş üç")
-      , (74, "yetmiş dört")
-      , (75, "yetmiş beş")
-      , (76, "yetmiş altı")
-      , (77, "yetmiş yedi")
-      , (78, "yetmiş sekiz")
-      , (79, "yetmiş dokuz")
-      , (80, "seksen")
-      , (81, "seksen bir")
-      , (82, "seksen iki")
-      , (83, "seksen üç")
-      , (84, "seksen dört")
-      , (85, "seksen beş")
-      , (86, "seksen altı")
-      , (87, "seksen yedi")
-      , (88, "seksen sekiz")
-      , (89, "seksen dokuz")
-      , (90, "doksan")
-      , (91, "doksan bir")
-      , (92, "doksan iki")
-      , (93, "doksan üç")
-      , (94, "doksan dört")
-      , (95, "doksan beş")
-      , (96, "doksan altı")
-      , (97, "doksan yedi")
-      , (98, "doksan sekiz")
-      , (99, "doksan dokuz")
-      , (100, "yüz")
-      , (200, "iki yüz")
-      , (300, "üç yüz")
-      , (400, "dört yüz")
-      , (500, "beş yüz")
-      , (600, "altı yüz")
-      , (700, "yedi yüz")
-      , (800, "sekiz yüz")
-      , (900, "dokuz yüz")
-      , (1000, "bin")
-      , (2000, "iki bin")
-      , (3000, "üç bin")
-      , (4000, "dört bin")
-      , (5000, "beş bin")
-      , (6000, "altı bin")
-      , (7000, "yedi bin")
-      , (8000, "sekiz bin")
-      , (9000, "dokuz bin")
-      , (10000, "on bin")
-      , (11000, "onbir bin")
-      , (12000, "oniki bin")
-      , (13000, "onüç bin")
-      , (14000, "ondört bin")
-      , (15000, "onbeş bin")
-      , (16000, "onaltı bin")
-      , (17000, "onyedi bin")
-      , (18000, "onsekiz bin")
-      , (19000, "ondokuz bin")
-      , (20000, "yirmi bin")
-      , (21000, "yirmi bir bin")
-      , (22000, "yirmi iki bin")
-      , (23000, "yirmi üç bin")
-      , (24000, "yirmi dört bin")
-      , (25000, "yirmi beş bin")
-      , (26000, "yirmi altı bin")
-      , (27000, "yirmi yedi bin")
-      , (28000, "yirmi sekiz bin")
-      , (30000, "otuz bin")
-      , (50000, "elli bin")
-      , (100000, "yüz bin")
-      , (523758, "beş yüz yirmi üç bin yedi yüz elli sekiz")
-      , (dec 6, "bir milyon")
-      , (123456789, "yüz yirmi üç milyon dört yüz elli altı bin yedi yüz seksen dokuz")
-      , (dec 9, "bir bilyon")
-      , (dec 12, "bir trilyon")
-      , (dec 15, "bir katrilyon")
-      , (dec 18, "bir kentilyon")
-      , (dec 21, "bir sekstilyon")
-      , (dec 24, "bir septilyon")
-      , (dec 27, "bir oktilyon")
-      , (dec 30, "bir nonilyon")
-      , (dec 33, "bir desilyon")
-      , (dec 36, "bir andesilyon")
-      , (dec 39, "bir dodesilyon")
-      , (dec 42, "bir tredesilyon")
-      , (dec 45, "bir katordesilyon")
-      , (dec 48, "bir kendesilyon")
-      , (dec 51, "bir seksdesilyon")
-      , (dec 54, "bir septendesilyon")
-      , (dec 57, "bir oktodesilyon")
-      , (dec 60, "bir novemdesilyon")
-      , (dec 63, "bir vigintilyon")
-      , (dec 66, "bir anvigintilyon")
-      , (dec 69, "bir dovigintilyon")
-      , (dec 72, "bir tresvigintilyon")
-      , (dec 75, "bir katorvigintilyon")
-      , (dec 78, "bir kenkavigintilyon")
-      , (dec 81, "bir sesvigintilyon")
-      , (dec 84, "bir septemvigintilyon")
-      , (dec 87, "bir oktovigintilyon")
-      , (dec 90, "bir novemvigintilyon")
-      , (dec 93, "bir trigintilyon")
-      , (dec 96, "bir antrigintilyon")
-      , (dec 99, "bir dotrigintilyon")
-      , (dec 102, "bir trestrigintilyon")
-      , (dec 105, "bir katortrigintilyon")
-      , (dec 108, "bir kenkatrigintilyon")
-      , (dec 111, "bir sestrigintilyon")
-      , (dec 114, "bir septemtrigintilyon")
-      , (dec 117, "bir oktotrigintilyon")
-      , (dec 120, "bir novemtrigintilyon")
-      , (dec 123, "bir katragintilyon")
-      , (dec 153, "bir kenkagintilyon")
-      , (dec 183, "bir seksagintilyon")
-      , (dec 213, "bir septegintilyon")
-      , (dec 243, "bir oktogintilyon")
-      , (dec 273, "bir nonagintilyon")
-      , (dec 303, "bir sentilyon")
-      , (dec 306, "bir ansentilyon")
-      , (dec 309, "bir dosentilyon")
-      , (dec 312, "bir tresentilyon")
-      , (dec 333, "bir desisentilyon")
-      , (dec 336, "bir andesisentilyon")
-      , (dec 363, "bir vigintisentilyon")
-      , (dec 366, "bir anvigintisentilyon")
-      , (dec 393, "bir trigintasentilyon")
-      , (dec 423, "bir katragintasentilyon")
-      , (dec 453, "bir kenkagintasentilyon")
-      , (dec 483, "bir seksagintasentilyon")
-      , (dec 513, "bir septegintasentilyon")
-      , (dec 543, "bir oktogintasentilyon")
-      , (dec 573, "bir nonagintasentilyon")
-      , (dec 603, "bir dusentilyon")
-      -- , (dec 903, "bir tresentilyon") -- same as 10 ^ 312
-      , (dec 1203, "bir katringentilyon")
-      , (dec 1503, "bir kengentilyon")
-      , (dec 1803, "bir sesentilyon")
-      , (dec 2103, "bir septingentilyon")
-      , (dec 2403, "bir oktingentilyon")
-      , (dec 2703, "bir nongentilyon")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/TUR/TestData.hs b/src-test/Text/Numeral/Language/TUR/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/TUR/TestData.hs
@@ -0,0 +1,255 @@
+{-|
+[@ISO639-1@]        tr
+
+[@ISO639-2@]        tur
+
+[@ISO639-3@]        tur
+
+[@Native name@]     Türkçe
+
+[@English name@]    Turkish
+-}
+
+module Text.Numeral.Language.TUR.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-turkish/en/tur/
+  http://www.sf.airnet.ne.jp/~ts/language/number/turkish.html
+  http://www.turkishlanguage.co.uk/seasons.htm#article_15
+  http://www.turkeytravelplanner.com/details/LanguageGuide/100words_lessons/100Words_10.html
+  http://en.wikibooks.org/wiki/Turkish/Numbers
+  http://tr.wikipedia.org/wiki/B%C3%BCy%C3%BCk_say%C4%B1lar%C4%B1n_adlar%C4%B1
+-}
+
+cardinals :: (Integral i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "sıfır")
+      , (1, "bir")
+      , (2, "iki")
+      , (3, "üç")
+      , (4, "dört")
+      , (5, "beş")
+      , (6, "altı")
+      , (7, "yedi")
+      , (8, "sekiz")
+      , (9, "dokuz")
+      , (10, "on")
+      , (11, "on bir")
+      , (12, "on iki")
+      , (13, "on üç")
+      , (14, "on dört")
+      , (15, "on beş")
+      , (16, "on altı")
+      , (17, "on yedi")
+      , (18, "on sekiz")
+      , (19, "on dokuz")
+      , (20, "yirmi")
+      , (21, "yirmi bir")
+      , (22, "yirmi iki")
+      , (23, "yirmi üç")
+      , (24, "yirmi dört")
+      , (25, "yirmi beş")
+      , (26, "yirmi altı")
+      , (27, "yirmi yedi")
+      , (28, "yirmi sekiz")
+      , (29, "yirmi dokuz")
+      , (30, "otuz")
+      , (31, "otuz bir")
+      , (32, "otuz iki")
+      , (33, "otuz üç")
+      , (34, "otuz dört")
+      , (35, "otuz beş")
+      , (36, "otuz altı")
+      , (37, "otuz yedi")
+      , (38, "otuz sekiz")
+      , (39, "otuz dokuz")
+      , (40, "kırk")
+      , (41, "kırk bir")
+      , (42, "kırk iki")
+      , (43, "kırk üç")
+      , (44, "kırk dört")
+      , (45, "kırk beş")
+      , (46, "kırk altı")
+      , (47, "kırk yedi")
+      , (48, "kırk sekiz")
+      , (49, "kırk dokuz")
+      , (50, "elli")
+      , (51, "elli bir")
+      , (52, "elli iki")
+      , (53, "elli üç")
+      , (54, "elli dört")
+      , (55, "elli beş")
+      , (56, "elli altı")
+      , (57, "elli yedi")
+      , (58, "elli sekiz")
+      , (59, "elli dokuz")
+      , (60, "altmış")
+      , (61, "altmış bir")
+      , (62, "altmış iki")
+      , (63, "altmış üç")
+      , (64, "altmış dört")
+      , (65, "altmış beş")
+      , (66, "altmış altı")
+      , (67, "altmış yedi")
+      , (68, "altmış sekiz")
+      , (69, "altmış dokuz")
+      , (70, "yetmiş")
+      , (71, "yetmiş bir")
+      , (72, "yetmiş iki")
+      , (73, "yetmiş üç")
+      , (74, "yetmiş dört")
+      , (75, "yetmiş beş")
+      , (76, "yetmiş altı")
+      , (77, "yetmiş yedi")
+      , (78, "yetmiş sekiz")
+      , (79, "yetmiş dokuz")
+      , (80, "seksen")
+      , (81, "seksen bir")
+      , (82, "seksen iki")
+      , (83, "seksen üç")
+      , (84, "seksen dört")
+      , (85, "seksen beş")
+      , (86, "seksen altı")
+      , (87, "seksen yedi")
+      , (88, "seksen sekiz")
+      , (89, "seksen dokuz")
+      , (90, "doksan")
+      , (91, "doksan bir")
+      , (92, "doksan iki")
+      , (93, "doksan üç")
+      , (94, "doksan dört")
+      , (95, "doksan beş")
+      , (96, "doksan altı")
+      , (97, "doksan yedi")
+      , (98, "doksan sekiz")
+      , (99, "doksan dokuz")
+      , (100, "yüz")
+      , (200, "iki yüz")
+      , (300, "üç yüz")
+      , (400, "dört yüz")
+      , (500, "beş yüz")
+      , (600, "altı yüz")
+      , (700, "yedi yüz")
+      , (800, "sekiz yüz")
+      , (900, "dokuz yüz")
+      , (1000, "bin")
+      , (2000, "iki bin")
+      , (3000, "üç bin")
+      , (4000, "dört bin")
+      , (5000, "beş bin")
+      , (6000, "altı bin")
+      , (7000, "yedi bin")
+      , (8000, "sekiz bin")
+      , (9000, "dokuz bin")
+      , (10000, "on bin")
+      , (11000, "onbir bin")
+      , (12000, "oniki bin")
+      , (13000, "onüç bin")
+      , (14000, "ondört bin")
+      , (15000, "onbeş bin")
+      , (16000, "onaltı bin")
+      , (17000, "onyedi bin")
+      , (18000, "onsekiz bin")
+      , (19000, "ondokuz bin")
+      , (20000, "yirmi bin")
+      , (21000, "yirmi bir bin")
+      , (22000, "yirmi iki bin")
+      , (23000, "yirmi üç bin")
+      , (24000, "yirmi dört bin")
+      , (25000, "yirmi beş bin")
+      , (26000, "yirmi altı bin")
+      , (27000, "yirmi yedi bin")
+      , (28000, "yirmi sekiz bin")
+      , (30000, "otuz bin")
+      , (50000, "elli bin")
+      , (100000, "yüz bin")
+      , (523758, "beş yüz yirmi üç bin yedi yüz elli sekiz")
+      , (dec 6, "bir milyon")
+      , (123456789, "yüz yirmi üç milyon dört yüz elli altı bin yedi yüz seksen dokuz")
+      , (dec 9, "bir bilyon")
+      , (dec 12, "bir trilyon")
+      , (dec 15, "bir katrilyon")
+      , (dec 18, "bir kentilyon")
+      , (dec 21, "bir sekstilyon")
+      , (dec 24, "bir septilyon")
+      , (dec 27, "bir oktilyon")
+      , (dec 30, "bir nonilyon")
+      , (dec 33, "bir desilyon")
+      , (dec 36, "bir andesilyon")
+      , (dec 39, "bir dodesilyon")
+      , (dec 42, "bir tredesilyon")
+      , (dec 45, "bir katordesilyon")
+      , (dec 48, "bir kendesilyon")
+      , (dec 51, "bir seksdesilyon")
+      , (dec 54, "bir septendesilyon")
+      , (dec 57, "bir oktodesilyon")
+      , (dec 60, "bir novemdesilyon")
+      , (dec 63, "bir vigintilyon")
+      , (dec 66, "bir anvigintilyon")
+      , (dec 69, "bir dovigintilyon")
+      , (dec 72, "bir tresvigintilyon")
+      , (dec 75, "bir katorvigintilyon")
+      , (dec 78, "bir kenkavigintilyon")
+      , (dec 81, "bir sesvigintilyon")
+      , (dec 84, "bir septemvigintilyon")
+      , (dec 87, "bir oktovigintilyon")
+      , (dec 90, "bir novemvigintilyon")
+      , (dec 93, "bir trigintilyon")
+      , (dec 96, "bir antrigintilyon")
+      , (dec 99, "bir dotrigintilyon")
+      , (dec 102, "bir trestrigintilyon")
+      , (dec 105, "bir katortrigintilyon")
+      , (dec 108, "bir kenkatrigintilyon")
+      , (dec 111, "bir sestrigintilyon")
+      , (dec 114, "bir septemtrigintilyon")
+      , (dec 117, "bir oktotrigintilyon")
+      , (dec 120, "bir novemtrigintilyon")
+      , (dec 123, "bir katragintilyon")
+      , (dec 153, "bir kenkagintilyon")
+      , (dec 183, "bir seksagintilyon")
+      , (dec 213, "bir septegintilyon")
+      , (dec 243, "bir oktogintilyon")
+      , (dec 273, "bir nonagintilyon")
+      , (dec 303, "bir sentilyon")
+      , (dec 306, "bir ansentilyon")
+      , (dec 309, "bir dosentilyon")
+      , (dec 312, "bir tresentilyon")
+      , (dec 333, "bir desisentilyon")
+      , (dec 336, "bir andesisentilyon")
+      , (dec 363, "bir vigintisentilyon")
+      , (dec 366, "bir anvigintisentilyon")
+      , (dec 393, "bir trigintasentilyon")
+      , (dec 423, "bir katragintasentilyon")
+      , (dec 453, "bir kenkagintasentilyon")
+      , (dec 483, "bir seksagintasentilyon")
+      , (dec 513, "bir septegintasentilyon")
+      , (dec 543, "bir oktogintasentilyon")
+      , (dec 573, "bir nonagintasentilyon")
+      , (dec 603, "bir dusentilyon")
+      -- , (dec 903, "bir tresentilyon") -- same as 10 ^ 312
+      , (dec 1203, "bir katringentilyon")
+      , (dec 1503, "bir kengentilyon")
+      , (dec 1803, "bir sesentilyon")
+      , (dec 2103, "bir septingentilyon")
+      , (dec 2403, "bir oktingentilyon")
+      , (dec 2703, "bir nongentilyon")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/WMW/TestData.hs b/src-test/Text/Numeral/Language/WMW/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/WMW/TestData.hs
@@ -0,0 +1,174 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        wmw
+
+[@Native name@]     -
+
+[@English name@]    Mwani
+-}
+module Text.Numeral.Language.WMW.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-mwani/en/wmw/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "m’moja")
+      , (2, "mbire")
+      , (3, "natu")
+      , (4, "n’né")
+      , (5, "n’tano")
+      , (6, "sita")
+      , (7, "saba")
+      , (8, "nane")
+      , (9, "khénta")
+      , (10, "kumi")
+      , (11, "kumi na m’moja")
+      , (12, "kumi na mbire")
+      , (13, "kumi na natu")
+      , (14, "kumi na n’né")
+      , (15, "kumi na n’tano")
+      , (16, "kumi na sita")
+      , (17, "kumi na saba")
+      , (18, "kumi na nane")
+      , (19, "kumi na khénta")
+      , (20, "shirini")
+      , (21, "shirini na m’moja")
+      , (22, "shirini na mbire")
+      , (23, "shirini na natu")
+      , (24, "shirini na n’né")
+      , (25, "shirini na n’tano")
+      , (26, "shirini na sita")
+      , (27, "shirini na saba")
+      , (28, "shirini na nane")
+      , (29, "shirini na khénta")
+      , (30, "talatini")
+      , (31, "talatini na m’moja")
+      , (32, "talatini na mbire")
+      , (33, "talatini na natu")
+      , (34, "talatini na n’né")
+      , (35, "talatini na n’tano")
+      , (36, "talatini na sita")
+      , (37, "talatini na saba")
+      , (38, "talatini na nane")
+      , (39, "talatini na khénta")
+      , (40, "arubaine")
+      , (41, "arubaine na m’moja")
+      , (42, "arubaine na mbire")
+      , (43, "arubaine na natu")
+      , (44, "arubaine na n’né")
+      , (45, "arubaine na n’tano")
+      , (46, "arubaine na sita")
+      , (47, "arubaine na saba")
+      , (48, "arubaine na nane")
+      , (49, "arubaine na khénta")
+      , (50, "amusine")
+      , (51, "amusine na m’moja")
+      , (52, "amusine na mbire")
+      , (53, "amusine na natu")
+      , (54, "amusine na n’né")
+      , (55, "amusine na n’tano")
+      , (56, "amusine na sita")
+      , (57, "amusine na saba")
+      , (58, "amusine na nane")
+      , (59, "amusine na khénta")
+      , (60, "sitine")
+      , (61, "sitine na m’moja")
+      , (62, "sitine na mbire")
+      , (63, "sitine na natu")
+      , (64, "sitine na n’né")
+      , (65, "sitine na n’tano")
+      , (66, "sitine na sita")
+      , (67, "sitine na saba")
+      , (68, "sitine na nane")
+      , (69, "sitine na khénta")
+      , (70, "sabine")
+      , (71, "sabine na m’moja")
+      , (72, "sabine na mbire")
+      , (73, "sabine na natu")
+      , (74, "sabine na n’né")
+      , (75, "sabine na n’tano")
+      , (76, "sabine na sita")
+      , (77, "sabine na saba")
+      , (78, "sabine na nane")
+      , (79, "sabine na khénta")
+      , (80, "tamanine")
+      , (81, "tamanine na m’moja")
+      , (82, "tamanine na mbire")
+      , (83, "tamanine na natu")
+      , (84, "tamanine na n’né")
+      , (85, "tamanine na n’tano")
+      , (86, "tamanine na sita")
+      , (87, "tamanine na saba")
+      , (88, "tamanine na nane")
+      , (89, "tamanine na khénta")
+      , (90, "tusuine")
+      , (91, "tusuine na m’moja")
+      , (92, "tusuine na mbire")
+      , (93, "tusuine na natu")
+      , (94, "tusuine na n’né")
+      , (95, "tusuine na n’tano")
+      , (96, "tusuine na sita")
+      , (97, "tusuine na saba")
+      , (98, "tusuine na nane")
+      , (99, "tusuine na khénta")
+      , (100, "mia")
+      , (101, "mia na m’moja")
+      , (102, "mia na mbire")
+      , (103, "mia na natu")
+      , (104, "mia na n’né")
+      , (105, "mia na n’tano")
+      , (106, "mia na sita")
+      , (107, "mia na saba")
+      , (108, "mia na nane")
+      , (109, "mia na khénta")
+      , (110, "mia na kumi")
+      , (123, "mia na shirini na natu")
+      , (200, "mia mbire")
+      , (300, "mia natu")
+      , (321, "mia natu na shirini na m’moja")
+      , (400, "mia n’né")
+      , (500, "mia n’tano")
+      , (600, "mia sita")
+      , (700, "mia saba")
+      , (800, "mia nane")
+      , (900, "mia khénta")
+      , (909, "mia khénta na khénta")
+      , (990, "mia khénta na tusuine")
+      , (999, "mia khénta na tusuine na khénta")
+      , (1000, "álufu")
+      , (1001, "álufu m’moja na m’moja")
+      , (1008, "álufu m’moja na nane")
+      , (1234, "álufu m’moja na mia mbire na talatini na n’né")
+      , (2000, "álufu mbire")
+      , (3000, "álufu natu")
+      , (4000, "álufu n’né")
+      , (4321, "álufu n’né na mia natu na shirini na m’moja")
+      , (5000, "álufu n’tano")
+      , (6000, "álufu sita")
+      , (7000, "álufu saba")
+      , (8000, "álufu nane")
+      , (9000, "álufu khénta")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/WO/TestData.hs b/src-test/Text/Numeral/Language/WO/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/WO/TestData.hs
+++ /dev/null
@@ -1,174 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        wo
-
-[@ISO639-2@]        wo1
-
-[@ISO639-3@]        wo1
-
-[@Native name@]     Wolof
-
-[@English name@]    Wolof
--}
-
-module Text.Numeral.Language.WO.TestData (cardinals) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "this" Text.Numeral.Test ( TestData )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://en.wikipedia.org/wiki/Wolof_language#Numerals
-  http://www.sf.airnet.ne.jp/~ts/language/number/wolof.html
--}
-
-cardinals ∷ (Num i) ⇒ TestData i
-cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (1, "benn")
-      , (2, "ñaar")
-      , (3, "ñett")
-      , (4, "ñeent")
-      , (5, "juróom")
-      , (6, "juróom-benn")
-      , (7, "juróom-ñaar")
-      , (8, "juróom-ñett")
-      , (9, "juróom-ñeent")
-      , (10, "fukk")
-      , (11, "fukk ak benn")
-      , (12, "fukk ak ñaar")
-      , (13, "fukk ak ñett")
-      , (14, "fukk ak ñeent")
-      , (15, "fukk ak juróom")
-      , (16, "fukk ak juróom-benn")
-      , (17, "fukk ak juróom-ñaar")
-      , (18, "fukk ak juróom-ñett")
-      , (19, "fukk ak juróom-ñeent")
-      , (20, "ñaar-fukk")
-      , (21, "ñaar-fukk ak benn")
-      , (22, "ñaar-fukk ak ñaar")
-      , (23, "ñaar-fukk ak ñett")
-      , (24, "ñaar-fukk ak ñeent")
-      , (25, "ñaar-fukk ak juróom")
-      , (26, "ñaar-fukk ak juróom-benn")
-      , (27, "ñaar-fukk ak juróom-ñaar")
-      , (28, "ñaar-fukk ak juróom-ñett")
-      , (29, "ñaar-fukk ak juróom-ñeent")
-      , (30, "ñett-fukk")
-      , (31, "ñett-fukk ak benn")
-      , (32, "ñett-fukk ak ñaar")
-      , (33, "ñett-fukk ak ñett")
-      , (34, "ñett-fukk ak ñeent")
-      , (35, "ñett-fukk ak juróom")
-      , (36, "ñett-fukk ak juróom-benn")
-      , (37, "ñett-fukk ak juróom-ñaar")
-      , (38, "ñett-fukk ak juróom-ñett")
-      , (39, "ñett-fukk ak juróom-ñeent")
-      , (40, "ñeent-fukk")
-      , (41, "ñeent-fukk ak benn")
-      , (42, "ñeent-fukk ak ñaar")
-      , (43, "ñeent-fukk ak ñett")
-      , (44, "ñeent-fukk ak ñeent")
-      , (45, "ñeent-fukk ak juróom")
-      , (46, "ñeent-fukk ak juróom-benn")
-      , (47, "ñeent-fukk ak juróom-ñaar")
-      , (48, "ñeent-fukk ak juróom-ñett")
-      , (49, "ñeent-fukk ak juróom-ñeent")
-      , (50, "juróom-fukk")
-      , (51, "juróom-fukk ak benn")
-      , (52, "juróom-fukk ak ñaar")
-      , (53, "juróom-fukk ak ñett")
-      , (54, "juróom-fukk ak ñeent")
-      , (55, "juróom-fukk ak juróom")
-      , (56, "juróom-fukk ak juróom-benn")
-      , (57, "juróom-fukk ak juróom-ñaar")
-      , (58, "juróom-fukk ak juróom-ñett")
-      , (59, "juróom-fukk ak juróom-ñeent")
-      , (60, "juróom-benn-fukk")
-      , (61, "juróom-benn-fukk ak benn")
-      , (62, "juróom-benn-fukk ak ñaar")
-      , (63, "juróom-benn-fukk ak ñett")
-      , (64, "juróom-benn-fukk ak ñeent")
-      , (65, "juróom-benn-fukk ak juróom")
-      , (66, "juróom-benn-fukk ak juróom-benn")
-      , (67, "juróom-benn-fukk ak juróom-ñaar")
-      , (68, "juróom-benn-fukk ak juróom-ñett")
-      , (69, "juróom-benn-fukk ak juróom-ñeent")
-      , (70, "juróom-ñaar-fukk")
-      , (71, "juróom-ñaar-fukk ak benn")
-      , (72, "juróom-ñaar-fukk ak ñaar")
-      , (73, "juróom-ñaar-fukk ak ñett")
-      , (74, "juróom-ñaar-fukk ak ñeent")
-      , (75, "juróom-ñaar-fukk ak juróom")
-      , (76, "juróom-ñaar-fukk ak juróom-benn")
-      , (77, "juróom-ñaar-fukk ak juróom-ñaar")
-      , (78, "juróom-ñaar-fukk ak juróom-ñett")
-      , (79, "juróom-ñaar-fukk ak juróom-ñeent")
-      , (80, "juróom-ñett-fukk")
-      , (81, "juróom-ñett-fukk ak benn")
-      , (82, "juróom-ñett-fukk ak ñaar")
-      , (83, "juróom-ñett-fukk ak ñett")
-      , (84, "juróom-ñett-fukk ak ñeent")
-      , (85, "juróom-ñett-fukk ak juróom")
-      , (86, "juróom-ñett-fukk ak juróom-benn")
-      , (87, "juróom-ñett-fukk ak juróom-ñaar")
-      , (88, "juróom-ñett-fukk ak juróom-ñett")
-      , (89, "juróom-ñett-fukk ak juróom-ñeent")
-      , (90, "juróom-ñeent-fukk")
-      , (91, "juróom-ñeent-fukk ak benn")
-      , (92, "juróom-ñeent-fukk ak ñaar")
-      , (93, "juróom-ñeent-fukk ak ñett")
-      , (94, "juróom-ñeent-fukk ak ñeent")
-      , (95, "juróom-ñeent-fukk ak juróom")
-      , (96, "juróom-ñeent-fukk ak juróom-benn")
-      , (97, "juróom-ñeent-fukk ak juróom-ñaar")
-      , (98, "juróom-ñeent-fukk ak juróom-ñett")
-      , (99, "juróom-ñeent-fukk ak juróom-ñeent")
-      , (100, "téeméer")
-      , (101, "téeméer ak benn")
-      , (106, "téeméer ak juróom-benn")
-      , (110, "téeméer ak fukk")
-      , (200, "ñaari téeméer")
-      , (300, "ñetti téeméer")
-      , (400, "ñeenti téeméer")
-      , (500, "juróomi téeméer")
-      , (600, "juróom-benni téeméer")
-      , (700, "juróom-ñaari téeméer")
-      , (800, "juróom-ñetti téeméer")
-      , (900, "juróom-ñeenti téeméer")
-      , (1000, "junni")
-      , (1100, "junni ak téeméer")
-      , (1600, "junni ak juróom-benni téeméer")
-      , (1945, "junni ak juróom-ñeenti téeméer ak ñeent-fukk ak juróom")
-      , (1969, "junni ak juróom-ñeenti téeméer ak juróom-benn-fukk ak juróom-ñeent")
-      , (2000, "ñaari junni")
-      , (3000, "ñetti junni")
-      , (4000, "ñeenti junni")
-      , (5000, "juróomi junni")
-      , (6000, "juróom-benni junni")
-      , (7000, "juróom-ñaari junni")
-      , (8000, "juróom-ñetti junni")
-      , (9000, "juróom-ñeenti junni")
-      , (10000, "fukki junni")
-      , (100000, "téeméeri junni")
-      , (1000000, "tamndareet")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/WOL/TestData.hs b/src-test/Text/Numeral/Language/WOL/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/WOL/TestData.hs
@@ -0,0 +1,167 @@
+{-|
+[@ISO639-1@]        wo
+
+[@ISO639-2@]        wo1
+
+[@ISO639-3@]        wo1
+
+[@Native name@]     Wolof
+
+[@English name@]    Wolof
+-}
+
+module Text.Numeral.Language.WOL.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://en.wikipedia.org/wiki/Wolof_language#Numerals
+  http://www.sf.airnet.ne.jp/~ts/language/number/wolof.html
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "benn")
+      , (2, "ñaar")
+      , (3, "ñett")
+      , (4, "ñeent")
+      , (5, "juróom")
+      , (6, "juróom-benn")
+      , (7, "juróom-ñaar")
+      , (8, "juróom-ñett")
+      , (9, "juróom-ñeent")
+      , (10, "fukk")
+      , (11, "fukk ak benn")
+      , (12, "fukk ak ñaar")
+      , (13, "fukk ak ñett")
+      , (14, "fukk ak ñeent")
+      , (15, "fukk ak juróom")
+      , (16, "fukk ak juróom-benn")
+      , (17, "fukk ak juróom-ñaar")
+      , (18, "fukk ak juróom-ñett")
+      , (19, "fukk ak juróom-ñeent")
+      , (20, "ñaar-fukk")
+      , (21, "ñaar-fukk ak benn")
+      , (22, "ñaar-fukk ak ñaar")
+      , (23, "ñaar-fukk ak ñett")
+      , (24, "ñaar-fukk ak ñeent")
+      , (25, "ñaar-fukk ak juróom")
+      , (26, "ñaar-fukk ak juróom-benn")
+      , (27, "ñaar-fukk ak juróom-ñaar")
+      , (28, "ñaar-fukk ak juróom-ñett")
+      , (29, "ñaar-fukk ak juróom-ñeent")
+      , (30, "ñett-fukk")
+      , (31, "ñett-fukk ak benn")
+      , (32, "ñett-fukk ak ñaar")
+      , (33, "ñett-fukk ak ñett")
+      , (34, "ñett-fukk ak ñeent")
+      , (35, "ñett-fukk ak juróom")
+      , (36, "ñett-fukk ak juróom-benn")
+      , (37, "ñett-fukk ak juróom-ñaar")
+      , (38, "ñett-fukk ak juróom-ñett")
+      , (39, "ñett-fukk ak juróom-ñeent")
+      , (40, "ñeent-fukk")
+      , (41, "ñeent-fukk ak benn")
+      , (42, "ñeent-fukk ak ñaar")
+      , (43, "ñeent-fukk ak ñett")
+      , (44, "ñeent-fukk ak ñeent")
+      , (45, "ñeent-fukk ak juróom")
+      , (46, "ñeent-fukk ak juróom-benn")
+      , (47, "ñeent-fukk ak juróom-ñaar")
+      , (48, "ñeent-fukk ak juróom-ñett")
+      , (49, "ñeent-fukk ak juróom-ñeent")
+      , (50, "juróom-fukk")
+      , (51, "juróom-fukk ak benn")
+      , (52, "juróom-fukk ak ñaar")
+      , (53, "juróom-fukk ak ñett")
+      , (54, "juróom-fukk ak ñeent")
+      , (55, "juróom-fukk ak juróom")
+      , (56, "juróom-fukk ak juróom-benn")
+      , (57, "juróom-fukk ak juróom-ñaar")
+      , (58, "juróom-fukk ak juróom-ñett")
+      , (59, "juróom-fukk ak juróom-ñeent")
+      , (60, "juróom-benn-fukk")
+      , (61, "juróom-benn-fukk ak benn")
+      , (62, "juróom-benn-fukk ak ñaar")
+      , (63, "juróom-benn-fukk ak ñett")
+      , (64, "juróom-benn-fukk ak ñeent")
+      , (65, "juróom-benn-fukk ak juróom")
+      , (66, "juróom-benn-fukk ak juróom-benn")
+      , (67, "juróom-benn-fukk ak juróom-ñaar")
+      , (68, "juróom-benn-fukk ak juróom-ñett")
+      , (69, "juróom-benn-fukk ak juróom-ñeent")
+      , (70, "juróom-ñaar-fukk")
+      , (71, "juróom-ñaar-fukk ak benn")
+      , (72, "juróom-ñaar-fukk ak ñaar")
+      , (73, "juróom-ñaar-fukk ak ñett")
+      , (74, "juróom-ñaar-fukk ak ñeent")
+      , (75, "juróom-ñaar-fukk ak juróom")
+      , (76, "juróom-ñaar-fukk ak juróom-benn")
+      , (77, "juróom-ñaar-fukk ak juróom-ñaar")
+      , (78, "juróom-ñaar-fukk ak juróom-ñett")
+      , (79, "juróom-ñaar-fukk ak juróom-ñeent")
+      , (80, "juróom-ñett-fukk")
+      , (81, "juróom-ñett-fukk ak benn")
+      , (82, "juróom-ñett-fukk ak ñaar")
+      , (83, "juróom-ñett-fukk ak ñett")
+      , (84, "juróom-ñett-fukk ak ñeent")
+      , (85, "juróom-ñett-fukk ak juróom")
+      , (86, "juróom-ñett-fukk ak juróom-benn")
+      , (87, "juróom-ñett-fukk ak juróom-ñaar")
+      , (88, "juróom-ñett-fukk ak juróom-ñett")
+      , (89, "juróom-ñett-fukk ak juróom-ñeent")
+      , (90, "juróom-ñeent-fukk")
+      , (91, "juróom-ñeent-fukk ak benn")
+      , (92, "juróom-ñeent-fukk ak ñaar")
+      , (93, "juróom-ñeent-fukk ak ñett")
+      , (94, "juróom-ñeent-fukk ak ñeent")
+      , (95, "juróom-ñeent-fukk ak juróom")
+      , (96, "juróom-ñeent-fukk ak juróom-benn")
+      , (97, "juróom-ñeent-fukk ak juróom-ñaar")
+      , (98, "juróom-ñeent-fukk ak juróom-ñett")
+      , (99, "juróom-ñeent-fukk ak juróom-ñeent")
+      , (100, "téeméer")
+      , (101, "téeméer ak benn")
+      , (106, "téeméer ak juróom-benn")
+      , (110, "téeméer ak fukk")
+      , (200, "ñaari téeméer")
+      , (300, "ñetti téeméer")
+      , (400, "ñeenti téeméer")
+      , (500, "juróomi téeméer")
+      , (600, "juróom-benni téeméer")
+      , (700, "juróom-ñaari téeméer")
+      , (800, "juróom-ñetti téeméer")
+      , (900, "juróom-ñeenti téeméer")
+      , (1000, "junni")
+      , (1100, "junni ak téeméer")
+      , (1600, "junni ak juróom-benni téeméer")
+      , (1945, "junni ak juróom-ñeenti téeméer ak ñeent-fukk ak juróom")
+      , (1969, "junni ak juróom-ñeenti téeméer ak juróom-benn-fukk ak juróom-ñeent")
+      , (2000, "ñaari junni")
+      , (3000, "ñetti junni")
+      , (4000, "ñeenti junni")
+      , (5000, "juróomi junni")
+      , (6000, "juróom-benni junni")
+      , (7000, "juróom-ñaari junni")
+      , (8000, "juróom-ñetti junni")
+      , (9000, "juróom-ñeenti junni")
+      , (10000, "fukki junni")
+      , (100000, "téeméeri junni")
+      , (1000000, "tamndareet")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/XPQ/TestData.hs b/src-test/Text/Numeral/Language/XPQ/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/XPQ/TestData.hs
@@ -0,0 +1,138 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        xpq
+
+[@Native name@]     -
+
+[@English name@]    Mohegan-Pequot
+-}
+module Text.Numeral.Language.XPQ.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-mohegan-pequot/en/xpq/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "nuqut")
+      , (2, "nis")
+      , (3, "shwi")
+      , (4, "yáw")
+      , (5, "nupáw")
+      , (6, "qutôsk")
+      , (7, "nisôsk")
+      , (8, "shwôsk")
+      , (9, "pásukokun")
+      , (10, "páyaq")
+      , (11, "páyaq napni nuqut")
+      , (12, "páyaq napni nis")
+      , (13, "páyaq napni shwi")
+      , (14, "páyaq napni yáw")
+      , (15, "páyaq napni nupáw")
+      , (16, "páyaq napni qutôsk")
+      , (17, "páyaq napni nisôsk")
+      , (18, "páyaq napni shwôsk")
+      , (19, "páyaq napni pásukokun")
+      , (20, "nisuncák")
+      , (21, "nisuncák napni nuqut")
+      , (22, "nisuncák napni nis")
+      , (23, "nisuncák napni shwi")
+      , (24, "nisuncák napni yáw")
+      , (25, "nisuncák napni nupáw")
+      , (26, "nisuncák napni qutôsk")
+      , (27, "nisuncák napni nisôsk")
+      , (28, "nisuncák napni shwôsk")
+      , (29, "nisuncák napni pásukokun")
+      , (30, "swuncák")
+      , (31, "swuncák napni nuqut")
+      , (32, "swuncák napni nis")
+      , (33, "swuncák napni shwi")
+      , (34, "swuncák napni yáw")
+      , (35, "swuncák napni nupáw")
+      , (36, "swuncák napni qutôsk")
+      , (37, "swuncák napni nisôsk")
+      , (38, "swuncák napni shwôsk")
+      , (39, "swuncák napni pásukokun")
+      , (40, "yáwuncák")
+      , (41, "yáwuncák napni nuqut")
+      , (42, "yáwuncák napni nis")
+      , (43, "yáwuncák napni shwi")
+      , (44, "yáwuncák napni yáw")
+      , (45, "yáwuncák napni nupáw")
+      , (46, "yáwuncák napni qutôsk")
+      , (47, "yáwuncák napni nisôsk")
+      , (48, "yáwuncák napni shwôsk")
+      , (49, "yáwuncák napni pásukokun")
+      , (50, "nupáw-cahshuncák")
+      , (51, "nupáw-cahshuncák napni nuqut")
+      , (52, "nupáw-cahshuncák napni nis")
+      , (53, "nupáw-cahshuncák napni shwi")
+      , (54, "nupáw-cahshuncák napni yáw")
+      , (55, "nupáw-cahshuncák napni nupáw")
+      , (56, "nupáw-cahshuncák napni qutôsk")
+      , (57, "nupáw-cahshuncák napni nisôsk")
+      , (58, "nupáw-cahshuncák napni shwôsk")
+      , (59, "nupáw-cahshuncák napni pásukokun")
+      , (60, "qutôsk-cahshuncák")
+      , (61, "qutôsk-cahshuncák napni nuqut")
+      , (62, "qutôsk-cahshuncák napni nis")
+      , (63, "qutôsk-cahshuncák napni shwi")
+      , (64, "qutôsk-cahshuncák napni yáw")
+      , (65, "qutôsk-cahshuncák napni nupáw")
+      , (66, "qutôsk-cahshuncák napni qutôsk")
+      , (67, "qutôsk-cahshuncák napni nisôsk")
+      , (68, "qutôsk-cahshuncák napni shwôsk")
+      , (69, "qutôsk-cahshuncák napni pásukokun")
+      , (70, "nisôsk-cahshuncák")
+      , (71, "nisôsk-cahshuncák napni nuqut")
+      , (72, "nisôsk-cahshuncák napni nis")
+      , (73, "nisôsk-cahshuncák napni shwi")
+      , (74, "nisôsk-cahshuncák napni yáw")
+      , (75, "nisôsk-cahshuncák napni nupáw")
+      , (76, "nisôsk-cahshuncák napni qutôsk")
+      , (77, "nisôsk-cahshuncák napni nisôsk")
+      , (78, "nisôsk-cahshuncák napni shwôsk")
+      , (79, "nisôsk-cahshuncák napni pásukokun")
+      , (80, "shwôsk-cahshuncák")
+      , (81, "shwôsk-cahshuncák napni nuqut")
+      , (82, "shwôsk-cahshuncák napni nis")
+      , (83, "shwôsk-cahshuncák napni shwi")
+      , (84, "shwôsk-cahshuncák napni yáw")
+      , (85, "shwôsk-cahshuncák napni nupáw")
+      , (86, "shwôsk-cahshuncák napni qutôsk")
+      , (87, "shwôsk-cahshuncák napni nisôsk")
+      , (88, "shwôsk-cahshuncák napni shwôsk")
+      , (89, "shwôsk-cahshuncák napni pásukokun")
+      , (90, "pásukokun-cahshuncák")
+      , (91, "pásukokun-cahshuncák napni nuqut")
+      , (92, "pásukokun-cahshuncák napni nis")
+      , (93, "pásukokun-cahshuncák napni shwi")
+      , (94, "pásukokun-cahshuncák napni yáw")
+      , (95, "pásukokun-cahshuncák napni nupáw")
+      , (96, "pásukokun-cahshuncák napni qutôsk")
+      , (97, "pásukokun-cahshuncák napni nisôsk")
+      , (98, "pásukokun-cahshuncák napni shwôsk")
+      , (99, "pásukokun-cahshuncák napni pásukokun")
+      , (100, "pásuq")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/YOR/TestData.hs b/src-test/Text/Numeral/Language/YOR/TestData.hs
--- a/src-test/Text/Numeral/Language/YOR/TestData.hs
+++ b/src-test/Text/Numeral/Language/YOR/TestData.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        yo
 
@@ -23,8 +17,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude     ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -32,7 +25,7 @@
 -- Test data
 --------------------------------------------------------------------------------
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
@@ -148,4 +141,3 @@
       ]
     )
   ]
-
diff --git a/src-test/Text/Numeral/Language/ZAI/TestData.hs b/src-test/Text/Numeral/Language/ZAI/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/ZAI/TestData.hs
@@ -0,0 +1,174 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        zai
+
+[@Native name@]     diidxazá
+
+[@English name@]    Isthmus Zapotec
+-}
+module Text.Numeral.Language.ZAI.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-isthmus-zapotec/en/zai/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "tobi")
+      , (2, "chupa")
+      , (3, "chonna")
+      , (4, "tapa")
+      , (5, "gaayu’")
+      , (6, "xhoopa’")
+      , (7, "gadxe")
+      , (8, "xhono")
+      , (9, "ga’")
+      , (10, "chii")
+      , (11, "chii ne tobi")
+      , (12, "chii ne chupa")
+      , (13, "chii ne chonna")
+      , (14, "chii ne tapa")
+      , (15, "chii ne gaayu’")
+      , (16, "chii ne xhoopa’")
+      , (17, "chii ne gadxe")
+      , (18, "chii ne xhono")
+      , (19, "chii ne ga’")
+      , (20, "gande")
+      , (21, "gande ne tobi")
+      , (22, "gande ne chupa")
+      , (23, "gande ne chonna")
+      , (24, "gande ne tapa")
+      , (25, "gande ne gaayu’")
+      , (26, "gande ne xhoopa’")
+      , (27, "gande ne gadxe")
+      , (28, "gande ne xhono")
+      , (29, "gande ne ga’")
+      , (30, "gande chii")
+      , (31, "gande chii ne tobi")
+      , (32, "gande chii ne chupa")
+      , (33, "gande chii ne chonna")
+      , (34, "gande chii ne tapa")
+      , (35, "gande chii ne gaayu’")
+      , (36, "gande chii ne xhoopa’")
+      , (37, "gande chii ne gadxe")
+      , (38, "gande chii ne xhono")
+      , (39, "gande chii ne ga’")
+      , (40, "chupa late gande")
+      , (41, "chupa late gande ne tobi")
+      , (42, "chupa late gande ne chupa")
+      , (43, "chupa late gande ne chonna")
+      , (44, "chupa late gande ne tapa")
+      , (45, "chupa late gande ne gaayu’")
+      , (46, "chupa late gande ne xhoopa’")
+      , (47, "chupa late gande ne gadxe")
+      , (48, "chupa late gande ne xhono")
+      , (49, "chupa late gande ne ga’")
+      , (50, "chupa late gande chii")
+      , (51, "chupa late gande chii ne tobi")
+      , (52, "chupa late gande chii ne chupa")
+      , (53, "chupa late gande chii ne chonna")
+      , (54, "chupa late gande chii ne tapa")
+      , (55, "chupa late gande chii ne gaayu’")
+      , (56, "chupa late gande chii ne xhoopa’")
+      , (57, "chupa late gande chii ne gadxe")
+      , (58, "chupa late gande chii ne xhono")
+      , (59, "chupa late gande chii ne ga’")
+      , (60, "chonna late gande")
+      , (61, "chonna late gande ne tobi")
+      , (62, "chonna late gande ne chupa")
+      , (63, "chonna late gande ne chonna")
+      , (64, "chonna late gande ne tapa")
+      , (65, "chonna late gande ne gaayu’")
+      , (66, "chonna late gande ne xhoopa’")
+      , (67, "chonna late gande ne gadxe")
+      , (68, "chonna late gande ne xhono")
+      , (69, "chonna late gande ne ga’")
+      , (70, "chonna late gande chii")
+      , (71, "chonna late gande chii ne tobi")
+      , (72, "chonna late gande chii ne chupa")
+      , (73, "chonna late gande chii ne chonna")
+      , (74, "chonna late gande chii ne tapa")
+      , (75, "chonna late gande chii ne gaayu’")
+      , (76, "chonna late gande chii ne xhoopa’")
+      , (77, "chonna late gande chii ne gadxe")
+      , (78, "chonna late gande chii ne xhono")
+      , (79, "chonna late gande chii ne ga’")
+      , (80, "tapa late gande")
+      , (81, "tapa late gande ne tobi")
+      , (82, "tapa late gande ne chupa")
+      , (83, "tapa late gande ne chonna")
+      , (84, "tapa late gande ne tapa")
+      , (85, "tapa late gande ne gaayu’")
+      , (86, "tapa late gande ne xhoopa’")
+      , (87, "tapa late gande ne gadxe")
+      , (88, "tapa late gande ne xhono")
+      , (89, "tapa late gande ne ga’")
+      , (90, "tapa late gande chii")
+      , (91, "tapa late gande chii ne tobi")
+      , (92, "tapa late gande chii ne chupa")
+      , (93, "tapa late gande chii ne chonna")
+      , (94, "tapa late gande chii ne tapa")
+      , (95, "tapa late gande chii ne gaayu’")
+      , (96, "tapa late gande chii ne xhoopa’")
+      , (97, "tapa late gande chii ne gadxe")
+      , (98, "tapa late gande chii ne xhono")
+      , (99, "tapa late gande chii ne ga’")
+      , (100, "ti gayuaa")
+      , (101, "ti gayuaa tobi")
+      , (102, "ti gayuaa chupa")
+      , (103, "ti gayuaa chonna")
+      , (104, "ti gayuaa tapa")
+      , (105, "ti gayuaa gaayu’")
+      , (106, "ti gayuaa xhoopa’")
+      , (107, "ti gayuaa gadxe")
+      , (108, "ti gayuaa xhono")
+      , (109, "ti gayuaa ga’")
+      , (110, "ti gayuaa chii")
+      , (123, "ti gayuaa gande ne chonna")
+      , (200, "chupa gayuaa")
+      , (300, "chonna gayuaa")
+      , (321, "chonna gayuaa gande ne tobi")
+      , (400, "tapa gayuaa")
+      , (500, "gaayu’ gayuaa")
+      , (600, "xhoopa’ gayuaa")
+      , (700, "gadxe gayuaa")
+      , (800, "xhono gayuaa")
+      , (900, "ga’ gayuaa")
+      , (909, "ga’ gayuaa ga’")
+      , (990, "ga’ gayuaa tapa late gande chii")
+      , (999, "ga’ gayuaa tapa late gande chii ne ga’")
+      , (1000, "ti mil")
+      , (1001, "ti mil ne tobi")
+      , (1008, "ti mil ne xhono")
+      , (1234, "ti mil ne chupa gayuaa gande chii ne tapa")
+      , (2000, "chupa mil")
+      , (3000, "chonna mil")
+      , (4000, "tapa mil")
+      , (4321, "tapa mil ne chonna gayuaa gande ne tobi")
+      , (5000, "gaayu’ mil")
+      , (6000, "xhoopa’ mil")
+      , (7000, "gadxe mil")
+      , (8000, "xhono mil")
+      , (9000, "ga’ mil")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/ZAQ/TestData.hs b/src-test/Text/Numeral/Language/ZAQ/TestData.hs
--- a/src-test/Text/Numeral/Language/ZAQ/TestData.hs
+++ b/src-test/Text/Numeral/Language/ZAQ/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-aloapam-zapotec/en/zaq/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/ZH/TestData.hs b/src-test/Text/Numeral/Language/ZH/TestData.hs
deleted file mode 100644
--- a/src-test/Text/Numeral/Language/ZH/TestData.hs
+++ /dev/null
@@ -1,349 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        zh
-
-[@ISO639-2B@]       chi
-
-[@ISO639-2T@]       zho
-
-[@ISO639-3@]        cmn
-
-[@Native name@]     官話
-
-[@English name@]    Chinese
--}
-
-module Text.Numeral.Language.ZH.TestData
-    ( trad_cardinals
-    , simpl_cardinals
-    , finance_trad_cardinals
-    , finance_simpl_cardinals
-    , pinyin_cardinals
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Prelude     ( Integral )
-import "base-unicode-symbols" Data.Monoid.Unicode ( (⊕) )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
-import "numerals" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Test ( TestData )
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- Test data
---------------------------------------------------------------------------------
-
-{-
-Sources:
-  http://www.sf.airnet.ne.jp/~ts/language/number/mandarin.html
--}
-
--- | Cardinal numbers that are written the same using either
--- traditional or simplified characters.
-trad_simpl_cardinals ∷ (Integral i) ⇒ [(i, Text)]
-trad_simpl_cardinals =
-  [ (0, "零")
-  , (1, "一")
-  , (2, "二")
-  , (3, "三")
-  , (4, "四")
-  , (5, "五")
-  , (6, "六")
-  , (7, "七")
-  , (8, "八")
-  , (9, "九")
-  , (10, "十")
-  , (11, "十一")
-  , (12, "十二")
-  , (13, "十三")
-  , (14, "十四")
-  , (15, "十五")
-  , (16, "十六")
-  , (17, "十七")
-  , (18, "十八")
-  , (19, "十九")
-  , (20, "二十")
-  , (21, "二十一")
-  , (22, "二十二")
-  , (23, "二十三")
-  , (24, "二十四")
-  , (25, "二十五")
-  , (26, "二十六")
-  , (27, "二十七")
-  , (28, "二十八")
-  , (29, "二十九")
-  , (30, "三十")
-  , (31, "三十一")
-  , (32, "三十二")
-  , (33, "三十三")
-  , (34, "三十四")
-  , (35, "三十五")
-  , (36, "三十六")
-  , (37, "三十七")
-  , (38, "三十八")
-  , (39, "三十九")
-  , (40, "四十")
-  , (41, "四十一")
-  , (42, "四十二")
-  , (43, "四十三")
-  , (44, "四十四")
-  , (45, "四十五")
-  , (46, "四十六")
-  , (47, "四十七")
-  , (48, "四十八")
-  , (49, "四十九")
-  , (50, "五十")
-  , (51, "五十一")
-  , (52, "五十二")
-  , (53, "五十三")
-  , (54, "五十四")
-  , (55, "五十五")
-  , (56, "五十六")
-  , (57, "五十七")
-  , (58, "五十八")
-  , (59, "五十九")
-  , (60, "六十")
-  , (61, "六十一")
-  , (62, "六十二")
-  , (63, "六十三")
-  , (64, "六十四")
-  , (65, "六十五")
-  , (66, "六十六")
-  , (67, "六十七")
-  , (68, "六十八")
-  , (69, "六十九")
-  , (100, "一百")
-  , (114, "一百十四")
-  , (200, "二百")
-  , (205, "二百〇五")
-  , (208, "二百〇八")
-  , (280, "二百八十")
-  , (301, "三百〇一")
-  , (310, "三百十")
-  , (1000, "一千")
-  , (dec 12, "一兆")
-  , (dec 16, "一京")
-  , (dec 20, "一垓")
-  , (dec 24, "一秭")
-  , (dec 28, "一穰")
-  , (dec 32, "一溝")
-  , (dec 36, "一澗")
-  , (dec 40, "一正")
-  , (dec 44, "一載")
-  ]
-
-trad_cardinals ∷ (Integral i) ⇒ TestData i
-trad_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , trad_simpl_cardinals
-      ⊕ [ (2000, "兩千")
-        , (2008, "兩千〇八")
-        , (2080, "兩千〇八十")
-        , (2362, "兩千三百六十二")
-        , (2800, "兩千八百")
-        , (dec 4, "一萬")
-        , (10020, "一萬〇二十")
-        , (97375, "九萬七千三百七十五")
-        , (100004, "十萬〇四")
-        , (8734072, "八百七十三萬四千〇七十二")
-        , (10050026, "一千〇五萬〇二十六")
-        , (dec 8, "一億")
-        , (12345678902345, "十二兆三千四百五十六億七千八百九十萬兩千三百四十五")
-        ]
-    )
-  ]
-
-simpl_cardinals ∷ (Integral i) ⇒ TestData i
-simpl_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , trad_simpl_cardinals
-      ⊕ [ (2000, "两千")
-        , (2008, "两千〇八")
-        , (2080, "两千〇八十")
-        , (2362, "两千三百六十二")
-        , (2800, "两千八百")
-        , (dec 4, "一万")
-        , (dec 8, "一亿")
-        ]
-    )
-  ]
-
-finance_trad_cardinals ∷ (Integral i) ⇒ TestData i
-finance_trad_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "零")
-      , (1, "壹")
-      , (2, "貳")
-      , (3, "参")
-      , (4, "肆")
-      , (5, "伍")
-      , (6, "陸")
-      , (7, "柒")
-      , (8, "捌")
-      , (9, "玖")
-      , (10, "拾")
-      , (100, "壹伯")
-      , (1000, "壹仟")
-      , (dec 4, "壹萬")
-      , (dec 8, "壹億")
-      ]
-    )
-  ]
-
-finance_simpl_cardinals ∷ (Integral i) ⇒ TestData i
-finance_simpl_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "零")
-      , (1, "壹")
-      , (2, "贰")
-      , (3, "参")
-      , (4, "肆")
-      , (5, "伍")
-      , (6, "陆")
-      , (7, "柒")
-      , (8, "捌")
-      , (9, "玖")
-      , (10, "拾")
-      , (100, "壹伯")
-      , (1000, "壹仟")
-      , (dec 4, "壹万")
-      , (dec 8, "壹亿")
-      ]
-    )
-  ]
-
-pinyin_cardinals ∷ (Integral i) ⇒ TestData i
-pinyin_cardinals =
-  [ ( "default"
-    , defaultInflection
-    , [ (0, "líng")
-      , (1, "yī")
-      , (2, "èr")
-      , (3, "sān")
-      , (4, "sì")
-      , (5, "wǔ")
-      , (6, "liù")
-      , (7, "qī")
-      , (8, "bā")
-      , (9, "jiǔ")
-      , (10, "shí")
-      , (11, "shíyī")
-      , (12, "shíèr")
-      , (13, "shísān")
-      , (14, "shísì")
-      , (15, "shíwǔ")
-      , (16, "shíliù")
-      , (17, "shíqī")
-      , (18, "shíbā")
-      , (19, "shíjiǔ")
-      , (20, "èrshí")
-      , (21, "èrshí yī")
-      , (22, "èrshí èr")
-      , (23, "èrshí sān")
-      , (24, "èrshí sì")
-      , (25, "èrshí wǔ")
-      , (26, "èrshí liù")
-      , (27, "èrshí qī")
-      , (28, "èrshí bā")
-      , (29, "èrshí jiǔ")
-      , (30, "sānshí")
-      , (31, "sānshí yī")
-      , (32, "sānshí èr")
-      , (33, "sānshí sān")
-      , (34, "sānshí sì")
-      , (35, "sānshí wǔ")
-      , (36, "sānshí liù")
-      , (37, "sānshí qī")
-      , (38, "sānshí bā")
-      , (39, "sānshí jiǔ")
-      , (40, "sìshí")
-      , (41, "sìshí yī")
-      , (42, "sìshí èr")
-      , (43, "sìshí sān")
-      , (44, "sìshí sì")
-      , (45, "sìshí wǔ")
-      , (46, "sìshí liù")
-      , (47, "sìshí qī")
-      , (48, "sìshí bā")
-      , (49, "sìshí jiǔ")
-      , (50, "wǔshí")
-      , (51, "wǔshí yī")
-      , (52, "wǔshí èr")
-      , (53, "wǔshí sān")
-      , (54, "wǔshí sì")
-      , (55, "wǔshí wǔ")
-      , (56, "wǔshí liù")
-      , (57, "wǔshí qī")
-      , (58, "wǔshí bā")
-      , (59, "wǔshí jiǔ")
-      , (60, "liùshí")
-      , (61, "liùshí yī")
-      , (62, "liùshí èr")
-      , (63, "liùshí sān")
-      , (64, "liùshí sì")
-      , (65, "liùshí wǔ")
-      , (66, "liùshí liù")
-      , (67, "liùshí qī")
-      , (68, "liùshí bā")
-      , (69, "liùshí jiǔ")
-      , (70, "qīshí")
-      , (71, "qīshí yī")
-      , (72, "qīshí èr")
-      , (73, "qīshí sān")
-      , (74, "qīshí sì")
-      , (75, "qīshí wǔ")
-      , (76, "qīshí liù")
-      , (77, "qīshí qī")
-      , (78, "qīshí bā")
-      , (79, "qīshí jiǔ")
-      , (80, "bāshí")
-      , (81, "bāshí yī")
-      , (82, "bāshí èr")
-      , (83, "bāshí sān")
-      , (84, "bāshí sì")
-      , (85, "bāshí wǔ")
-      , (86, "bāshí liù")
-      , (87, "bāshí qī")
-      , (88, "bāshí bā")
-      , (89, "bāshí jiǔ")
-      , (90, "jiǔshí")
-      , (91, "jiǔshí yī")
-      , (92, "jiǔshí èr")
-      , (93, "jiǔshí sān")
-      , (94, "jiǔshí sì")
-      , (95, "jiǔshí wǔ")
-      , (96, "jiǔshí liù")
-      , (97, "jiǔshí qī")
-      , (98, "jiǔshí bā")
-      , (99, "jiǔshí jiǔ")
-      , (100, "yībǎi")
-      , (208, "èrbǎi líng bā")
-      , (280, "èrbǎi bāshí")
-      , (1000, "yīqiān")
-      , (1002, "yīqiān líng èr")
-      , (1020, "yīqiān líng èrshí")
-      , (1200, "yīqiān èrbǎi")
-      , (1203, "yīqiān èrbǎi líng sān")
-      , (1230, "yīqiān èrbǎi sānshí")
-      , (1234, "yīqiān èrbǎi sānshí sì")
-      , (2008, "liǎngqiān líng bā")
-      , (2080, "liǎngqiān líng bāshí")
-      , (2800, "liǎngqiān bābǎi")
-      , (97375, "jiǔwàn qīqiān sānbǎi qīshí wǔ")
-      ]
-    )
-  ]
diff --git a/src-test/Text/Numeral/Language/ZHO/TestData.hs b/src-test/Text/Numeral/Language/ZHO/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/ZHO/TestData.hs
@@ -0,0 +1,342 @@
+{-|
+[@ISO639-1@]        zh
+
+[@ISO639-2B@]       chi
+
+[@ISO639-2T@]       zho
+
+[@ISO639-3@]        cmn
+
+[@Native name@]     官話
+
+[@English name@]    Chinese
+-}
+
+module Text.Numeral.Language.ZHO.TestData
+    ( trad_cardinals
+    , simpl_cardinals
+    , finance_trad_cardinals
+    , finance_simpl_cardinals
+    , pinyin_cardinals
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Monoid ( (<>) )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "numerals" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Test ( TestData )
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.sf.airnet.ne.jp/~ts/language/number/mandarin.html
+-}
+
+-- | Cardinal numbers that are written the same using either
+-- traditional or simplified characters.
+trad_simpl_cardinals :: (Integral i) => [(i, Text)]
+trad_simpl_cardinals =
+  [ (0, "零")
+  , (1, "一")
+  , (2, "二")
+  , (3, "三")
+  , (4, "四")
+  , (5, "五")
+  , (6, "六")
+  , (7, "七")
+  , (8, "八")
+  , (9, "九")
+  , (10, "十")
+  , (11, "十一")
+  , (12, "十二")
+  , (13, "十三")
+  , (14, "十四")
+  , (15, "十五")
+  , (16, "十六")
+  , (17, "十七")
+  , (18, "十八")
+  , (19, "十九")
+  , (20, "二十")
+  , (21, "二十一")
+  , (22, "二十二")
+  , (23, "二十三")
+  , (24, "二十四")
+  , (25, "二十五")
+  , (26, "二十六")
+  , (27, "二十七")
+  , (28, "二十八")
+  , (29, "二十九")
+  , (30, "三十")
+  , (31, "三十一")
+  , (32, "三十二")
+  , (33, "三十三")
+  , (34, "三十四")
+  , (35, "三十五")
+  , (36, "三十六")
+  , (37, "三十七")
+  , (38, "三十八")
+  , (39, "三十九")
+  , (40, "四十")
+  , (41, "四十一")
+  , (42, "四十二")
+  , (43, "四十三")
+  , (44, "四十四")
+  , (45, "四十五")
+  , (46, "四十六")
+  , (47, "四十七")
+  , (48, "四十八")
+  , (49, "四十九")
+  , (50, "五十")
+  , (51, "五十一")
+  , (52, "五十二")
+  , (53, "五十三")
+  , (54, "五十四")
+  , (55, "五十五")
+  , (56, "五十六")
+  , (57, "五十七")
+  , (58, "五十八")
+  , (59, "五十九")
+  , (60, "六十")
+  , (61, "六十一")
+  , (62, "六十二")
+  , (63, "六十三")
+  , (64, "六十四")
+  , (65, "六十五")
+  , (66, "六十六")
+  , (67, "六十七")
+  , (68, "六十八")
+  , (69, "六十九")
+  , (100, "一百")
+  , (114, "一百十四")
+  , (200, "二百")
+  , (205, "二百〇五")
+  , (208, "二百〇八")
+  , (280, "二百八十")
+  , (301, "三百〇一")
+  , (310, "三百十")
+  , (1000, "一千")
+  , (dec 12, "一兆")
+  , (dec 16, "一京")
+  , (dec 20, "一垓")
+  , (dec 24, "一秭")
+  , (dec 28, "一穰")
+  , (dec 32, "一溝")
+  , (dec 36, "一澗")
+  , (dec 40, "一正")
+  , (dec 44, "一載")
+  ]
+
+trad_cardinals :: (Integral i) => TestData i
+trad_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , trad_simpl_cardinals
+      <> [ (2000, "兩千")
+        , (2008, "兩千〇八")
+        , (2080, "兩千〇八十")
+        , (2362, "兩千三百六十二")
+        , (2800, "兩千八百")
+        , (dec 4, "一萬")
+        , (10020, "一萬〇二十")
+        , (97375, "九萬七千三百七十五")
+        , (100004, "十萬〇四")
+        , (8734072, "八百七十三萬四千〇七十二")
+        , (10050026, "一千〇五萬〇二十六")
+        , (dec 8, "一億")
+        , (12345678902345, "十二兆三千四百五十六億七千八百九十萬兩千三百四十五")
+        ]
+    )
+  ]
+
+simpl_cardinals :: (Integral i) => TestData i
+simpl_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , trad_simpl_cardinals
+      <> [ (2000, "两千")
+        , (2008, "两千〇八")
+        , (2080, "两千〇八十")
+        , (2362, "两千三百六十二")
+        , (2800, "两千八百")
+        , (dec 4, "一万")
+        , (dec 8, "一亿")
+        ]
+    )
+  ]
+
+finance_trad_cardinals :: (Integral i) => TestData i
+finance_trad_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "零")
+      , (1, "壹")
+      , (2, "貳")
+      , (3, "参")
+      , (4, "肆")
+      , (5, "伍")
+      , (6, "陸")
+      , (7, "柒")
+      , (8, "捌")
+      , (9, "玖")
+      , (10, "拾")
+      , (100, "壹伯")
+      , (1000, "壹仟")
+      , (dec 4, "壹萬")
+      , (dec 8, "壹億")
+      ]
+    )
+  ]
+
+finance_simpl_cardinals :: (Integral i) => TestData i
+finance_simpl_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "零")
+      , (1, "壹")
+      , (2, "贰")
+      , (3, "参")
+      , (4, "肆")
+      , (5, "伍")
+      , (6, "陆")
+      , (7, "柒")
+      , (8, "捌")
+      , (9, "玖")
+      , (10, "拾")
+      , (100, "壹伯")
+      , (1000, "壹仟")
+      , (dec 4, "壹万")
+      , (dec 8, "壹亿")
+      ]
+    )
+  ]
+
+pinyin_cardinals :: (Integral i) => TestData i
+pinyin_cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (0, "líng")
+      , (1, "yī")
+      , (2, "èr")
+      , (3, "sān")
+      , (4, "sì")
+      , (5, "wǔ")
+      , (6, "liù")
+      , (7, "qī")
+      , (8, "bā")
+      , (9, "jiǔ")
+      , (10, "shí")
+      , (11, "shíyī")
+      , (12, "shíèr")
+      , (13, "shísān")
+      , (14, "shísì")
+      , (15, "shíwǔ")
+      , (16, "shíliù")
+      , (17, "shíqī")
+      , (18, "shíbā")
+      , (19, "shíjiǔ")
+      , (20, "èrshí")
+      , (21, "èrshí yī")
+      , (22, "èrshí èr")
+      , (23, "èrshí sān")
+      , (24, "èrshí sì")
+      , (25, "èrshí wǔ")
+      , (26, "èrshí liù")
+      , (27, "èrshí qī")
+      , (28, "èrshí bā")
+      , (29, "èrshí jiǔ")
+      , (30, "sānshí")
+      , (31, "sānshí yī")
+      , (32, "sānshí èr")
+      , (33, "sānshí sān")
+      , (34, "sānshí sì")
+      , (35, "sānshí wǔ")
+      , (36, "sānshí liù")
+      , (37, "sānshí qī")
+      , (38, "sānshí bā")
+      , (39, "sānshí jiǔ")
+      , (40, "sìshí")
+      , (41, "sìshí yī")
+      , (42, "sìshí èr")
+      , (43, "sìshí sān")
+      , (44, "sìshí sì")
+      , (45, "sìshí wǔ")
+      , (46, "sìshí liù")
+      , (47, "sìshí qī")
+      , (48, "sìshí bā")
+      , (49, "sìshí jiǔ")
+      , (50, "wǔshí")
+      , (51, "wǔshí yī")
+      , (52, "wǔshí èr")
+      , (53, "wǔshí sān")
+      , (54, "wǔshí sì")
+      , (55, "wǔshí wǔ")
+      , (56, "wǔshí liù")
+      , (57, "wǔshí qī")
+      , (58, "wǔshí bā")
+      , (59, "wǔshí jiǔ")
+      , (60, "liùshí")
+      , (61, "liùshí yī")
+      , (62, "liùshí èr")
+      , (63, "liùshí sān")
+      , (64, "liùshí sì")
+      , (65, "liùshí wǔ")
+      , (66, "liùshí liù")
+      , (67, "liùshí qī")
+      , (68, "liùshí bā")
+      , (69, "liùshí jiǔ")
+      , (70, "qīshí")
+      , (71, "qīshí yī")
+      , (72, "qīshí èr")
+      , (73, "qīshí sān")
+      , (74, "qīshí sì")
+      , (75, "qīshí wǔ")
+      , (76, "qīshí liù")
+      , (77, "qīshí qī")
+      , (78, "qīshí bā")
+      , (79, "qīshí jiǔ")
+      , (80, "bāshí")
+      , (81, "bāshí yī")
+      , (82, "bāshí èr")
+      , (83, "bāshí sān")
+      , (84, "bāshí sì")
+      , (85, "bāshí wǔ")
+      , (86, "bāshí liù")
+      , (87, "bāshí qī")
+      , (88, "bāshí bā")
+      , (89, "bāshí jiǔ")
+      , (90, "jiǔshí")
+      , (91, "jiǔshí yī")
+      , (92, "jiǔshí èr")
+      , (93, "jiǔshí sān")
+      , (94, "jiǔshí sì")
+      , (95, "jiǔshí wǔ")
+      , (96, "jiǔshí liù")
+      , (97, "jiǔshí qī")
+      , (98, "jiǔshí bā")
+      , (99, "jiǔshí jiǔ")
+      , (100, "yībǎi")
+      , (208, "èrbǎi líng bā")
+      , (280, "èrbǎi bāshí")
+      , (1000, "yīqiān")
+      , (1002, "yīqiān líng èr")
+      , (1020, "yīqiān líng èrshí")
+      , (1200, "yīqiān èrbǎi")
+      , (1203, "yīqiān èrbǎi líng sān")
+      , (1230, "yīqiān èrbǎi sānshí")
+      , (1234, "yīqiān èrbǎi sānshí sì")
+      , (2008, "liǎngqiān líng bā")
+      , (2080, "liǎngqiān líng bāshí")
+      , (2800, "liǎngqiān bābǎi")
+      , (97375, "jiǔwàn qīqiān sānbǎi qīshí wǔ")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Language/ZPC/TestData.hs b/src-test/Text/Numeral/Language/ZPC/TestData.hs
--- a/src-test/Text/Numeral/Language/ZPC/TestData.hs
+++ b/src-test/Text/Numeral/Language/ZPC/TestData.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -21,8 +16,7 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Num )
-import "numerals" Text.Numeral.Grammar.Reified ( defaultInflection )
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
 import "this" Text.Numeral.Test ( TestData )
 
 
@@ -35,7 +29,7 @@
   http://www.languagesandnumbers.com/how-to-count-in-choapan-zapotec/en/zpc/
 -}
 
-cardinals ∷ (Num i) ⇒ TestData i
+cardinals :: (Num i) => TestData i
 cardinals =
   [ ( "default"
     , defaultInflection
diff --git a/src-test/Text/Numeral/Language/ZPL/TestData.hs b/src-test/Text/Numeral/Language/ZPL/TestData.hs
new file mode 100644
--- /dev/null
+++ b/src-test/Text/Numeral/Language/ZPL/TestData.hs
@@ -0,0 +1,161 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        zpl
+
+[@Native name@]     East Sola de Vega Zapotec
+
+[@English name@]    Lachixío Zapotec
+-}
+module Text.Numeral.Language.ZPL.TestData (cardinals) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "numerals" Text.Numeral.Grammar ( defaultInflection )
+import "this" Text.Numeral.Test ( TestData )
+
+
+--------------------------------------------------------------------------------
+-- Test data
+--------------------------------------------------------------------------------
+
+{-
+Sources:
+  http://www.languagesandnumbers.com/how-to-count-in-lachixio-zapotec/en/zpl/
+-}
+
+cardinals :: (Num i) => TestData i
+cardinals =
+  [ ( "default"
+    , defaultInflection
+    , [ (1, "tucu")
+      , (2, "chiucu")
+      , (3, "chuna")
+      , (4, "tacu")
+      , (5, "ayu’")
+      , (6, "xu’cu")
+      , (7, "achi")
+      , (8, "xunu")
+      , (9, "quie’")
+      , (10, "chi’i")
+      , (11, "chi’i tucu")
+      , (12, "chi’i chiucu")
+      , (13, "chi’i chuna")
+      , (14, "chi’i tacu")
+      , (15, "chi’i ayu’")
+      , (16, "chi’i xu’cu")
+      , (17, "chi’i achi")
+      , (18, "chi’i xunu")
+      , (19, "chi’i quie’")
+      , (20, "ala")
+      , (21, "ala tucu")
+      , (22, "ala chiucu")
+      , (23, "ala chuna")
+      , (24, "ala tacu")
+      , (25, "ala ayu’")
+      , (26, "ala xu’cu")
+      , (27, "ala achi")
+      , (28, "ala xunu")
+      , (29, "ala quie’")
+      , (30, "ala llichi’i")
+      , (31, "ala llichi’i tucu")
+      , (32, "ala llichi’i chiucu")
+      , (33, "ala llichi’i chuna")
+      , (34, "ala llichi’i tacu")
+      , (35, "ala llichi’i ayu’")
+      , (36, "ala llichi’i xu’cu")
+      , (37, "ala llichi’i achi")
+      , (38, "ala llichi’i xunu")
+      , (39, "ala llichi’i quie’")
+      , (40, "chiu’a")
+      , (41, "chiu’a tucu")
+      , (42, "chiu’a chiucu")
+      , (43, "chiu’a chuna")
+      , (44, "chiu’a tacu")
+      , (45, "chiu’a ayu’")
+      , (46, "chiu’a xu’cu")
+      , (47, "chiu’a achi")
+      , (48, "chiu’a xunu")
+      , (49, "chiu’a quie’")
+      , (50, "chiu’a nu’ chi’i")
+      , (51, "chiu’a nu’ chi’i tucu")
+      , (52, "chiu’a nu’ chi’i chiucu")
+      , (53, "chiu’a nu’ chi’i chuna")
+      , (54, "chiu’a nu’ chi’i tacu")
+      , (55, "chiu’a nu’ chi’i ayu’")
+      , (56, "chiu’a nu’ chi’i xu’cu")
+      , (57, "chiu’a nu’ chi’i achi")
+      , (58, "chiu’a nu’ chi’i xunu")
+      , (59, "chiu’a nu’ chi’i quie’")
+      , (60, "ayuna")
+      , (61, "ayuna tucu")
+      , (62, "ayuna chiucu")
+      , (63, "ayuna chuna")
+      , (64, "ayuna tacu")
+      , (65, "ayuna ayu’")
+      , (66, "ayuna xu’cu")
+      , (67, "ayuna achi")
+      , (68, "ayuna xunu")
+      , (69, "ayuna quie’")
+      , (70, "ayuna nu’ chi’i")
+      , (71, "ayuna nu’ chi’i tucu")
+      , (72, "ayuna nu’ chi’i chiucu")
+      , (73, "ayuna nu’ chi’i chuna")
+      , (74, "ayuna nu’ chi’i tacu")
+      , (75, "ayuna nu’ chi’i ayu’")
+      , (76, "ayuna nu’ chi’i xu’cu")
+      , (77, "ayuna nu’ chi’i achi")
+      , (78, "ayuna nu’ chi’i xunu")
+      , (79, "ayuna nu’ chi’i quie’")
+      , (80, "tacu nu’ ala")
+      , (81, "tacu nu’ ala tucu")
+      , (82, "tacu nu’ ala chiucu")
+      , (83, "tacu nu’ ala chuna")
+      , (84, "tacu nu’ ala tacu")
+      , (85, "tacu nu’ ala ayu’")
+      , (86, "tacu nu’ ala xu’cu")
+      , (87, "tacu nu’ ala achi")
+      , (88, "tacu nu’ ala xunu")
+      , (89, "tacu nu’ ala quie’")
+      , (90, "chuna ala lli chi’i")
+      , (91, "chuna ala lli chi’i tucu")
+      , (92, "chuna ala lli chi’i chiucu")
+      , (93, "chuna ala lli chi’i chuna")
+      , (94, "chuna ala lli chi’i tacu")
+      , (95, "chuna ala lli chi’i ayu’")
+      , (96, "chuna ala lli chi’i xu’cu")
+      , (97, "chuna ala lli chi’i achi")
+      , (98, "chuna ala lli chi’i xunu")
+      , (99, "chuna ala lli chi’i quie’")
+      , (100, "tucu ayu’u")
+      , (101, "tucu ayu’u tucu")
+      , (102, "tucu ayu’u chiucu")
+      , (103, "tucu ayu’u chuna")
+      , (104, "tucu ayu’u tacu")
+      , (105, "tucu ayu’u ayu’")
+      , (106, "tucu ayu’u xu’cu")
+      , (107, "tucu ayu’u achi")
+      , (108, "tucu ayu’u xunu")
+      , (109, "tucu ayu’u quie’")
+      , (110, "tucu ayu’u chi’i")
+      , (123, "tucu ayu’u ala chuna")
+      , (200, "chiucu ayu’u")
+      , (300, "chuna ayu’u")
+      , (321, "chuna ayu’u ala tucu")
+      , (400, "tacu ayu’u")
+      , (500, "ayu’ ayu’u")
+      , (600, "xu’cu ayu’u")
+      , (700, "achi ayu’u")
+      , (800, "xunu ayu’u")
+      , (900, "quie’ ayu’u")
+      , (909, "quie’ ayu’u quie’")
+      , (990, "quie’ ayu’u chuna ala lli chi’i")
+      , (999, "quie’ ayu’u chuna ala lli chi’i quie’")
+      ]
+    )
+  ]
diff --git a/src-test/Text/Numeral/Test.hs b/src-test/Text/Numeral/Test.hs
--- a/src-test/Text/Numeral/Test.hs
+++ b/src-test/Text/Numeral/Test.hs
@@ -5,7 +5,7 @@
 module Text.Numeral.Test ( TestData ) where
 
 import "base" Data.String ( String )
-import "numerals" Text.Numeral.Grammar.Reified ( Inflection )
+import "numerals" Text.Numeral.Grammar ( Inflection )
 import "text" Data.Text ( Text )
 
 type TestData n = [(String, Inflection, [(n, Text)])]
diff --git a/src-test/test.hs b/src-test/test.hs
--- a/src-test/test.hs
+++ b/src-test/test.hs
@@ -1,10 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-
 module Main where
 
 
@@ -12,25 +5,15 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Control.Monad      ( (=<<), when )
-import "base" Data.Bool          ( Bool(True) )
-import "base" Data.Function      ( ($), on )
-import "base" Data.List          ( filter, groupBy, head, intercalate, length, map, sortBy )
-import "base" Data.Maybe         ( Maybe(Just), fromMaybe )
-import "base" Data.Ord           ( (<), (>), compare )
-import "base" Data.Tuple         ( fst, snd )
-import "base" Prelude            ( (+), (-), String )
+import "base" Control.Monad      ( when )
+import "base" Data.Function      ( on )
+import "base" Data.List          ( groupBy, intercalate, sortBy )
+import "base" Data.Maybe         ( fromMaybe )
 import "base" System.Environment ( getArgs )
-import "base" System.IO          ( IO )
 import "base" Text.Printf        ( printf )
-import "base" Text.Show          ( Show, show )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡), (≢) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Prelude.Unicode       ( ℤ, (⋅) )
 import "HUnit" Test.HUnit ( Assertion, assertFailure, assertBool )
-import           "numerals" Text.Numeral.Grammar
-import qualified "numerals" Text.Numeral.Grammar.Reified as GR
-import           "numerals" Text.Numeral.Misc ( dec, intLog )
+import "numerals" Text.Numeral.Grammar
+import "numerals" Text.Numeral.Misc ( dec, intLog )
 import "QuickCheck" Test.QuickCheck.Modifiers
     ( Positive(Positive), NonNegative(NonNegative) )
 import "test-framework" Test.Framework ( defaultMainWithOpts
@@ -44,125 +27,169 @@
 import "text" Data.Text ( Text )
 import qualified "text" Data.Text as T ( unpack )
 
-import qualified "numerals" Text.Numeral.Language.AF  as AF
+import qualified "numerals" Text.Numeral.Language.AFR as AFR
 import qualified "numerals" Text.Numeral.Language.AMP as AMP
-import qualified "numerals" Text.Numeral.Language.BG  as BG
+import qualified "numerals" Text.Numeral.Language.BUL as BUL
+import qualified "numerals" Text.Numeral.Language.CES as CES
 import qualified "numerals" Text.Numeral.Language.CHN as CHN
 import qualified "numerals" Text.Numeral.Language.CHR as CHR
 import qualified "numerals" Text.Numeral.Language.CLM as CLM
-import qualified "numerals" Text.Numeral.Language.CS  as CS
-import qualified "numerals" Text.Numeral.Language.DE  as DE
-import qualified "numerals" Text.Numeral.Language.EN  as EN
-import qualified "numerals" Text.Numeral.Language.EO  as EO
-import qualified "numerals" Text.Numeral.Language.ES  as ES
-import qualified "numerals" Text.Numeral.Language.FI  as FI
-import qualified "numerals" Text.Numeral.Language.FR  as FR
+import qualified "numerals" Text.Numeral.Language.CRO as CRO
+import qualified "numerals" Text.Numeral.Language.DEU as DEU
+import qualified "numerals" Text.Numeral.Language.ENG as ENG
+import qualified "numerals" Text.Numeral.Language.EPO as EPO
+import qualified "numerals" Text.Numeral.Language.FIN as FIN
+import qualified "numerals" Text.Numeral.Language.FRA as FRA
 import qualified "numerals" Text.Numeral.Language.FUR as FUR
+import qualified "numerals" Text.Numeral.Language.GLV as GLV
 import qualified "numerals" Text.Numeral.Language.GSW as GSW
-import qualified "numerals" Text.Numeral.Language.GV  as GV
-import qualified "numerals" Text.Numeral.Language.HE  as HE
+import qualified "numerals" Text.Numeral.Language.HEB as HEB
 import qualified "numerals" Text.Numeral.Language.HOP as HOP
-import qualified "numerals" Text.Numeral.Language.IT  as IT
-import qualified "numerals" Text.Numeral.Language.JA  as JA
-import qualified "numerals" Text.Numeral.Language.LA  as LA
+import qualified "numerals" Text.Numeral.Language.ITA as ITA
+import qualified "numerals" Text.Numeral.Language.JPN as JPN
+import qualified "numerals" Text.Numeral.Language.LAT as LAT
 import qualified "numerals" Text.Numeral.Language.LLD as LLD
-import qualified "numerals" Text.Numeral.Language.MG  as MG
-import qualified "numerals" Text.Numeral.Language.NL  as NL
-import qualified "numerals" Text.Numeral.Language.NO  as NO
+import qualified "numerals" Text.Numeral.Language.MLG as MLG
+import qualified "numerals" Text.Numeral.Language.NEN as NEN
+import qualified "numerals" Text.Numeral.Language.NLD as NLD
+import qualified "numerals" Text.Numeral.Language.NOB as NOB
 import qualified "numerals" Text.Numeral.Language.NQM as NQM
-import qualified "numerals" Text.Numeral.Language.OJ  as OJ
+import qualified "numerals" Text.Numeral.Language.OJI as OJI
 import qualified "numerals" Text.Numeral.Language.PDC as PDC
-import qualified "numerals" Text.Numeral.Language.PL  as PL
-import qualified "numerals" Text.Numeral.Language.PT  as PT
-import qualified "numerals" Text.Numeral.Language.RU  as RU
+import qualified "numerals" Text.Numeral.Language.POL as POL
+import qualified "numerals" Text.Numeral.Language.POR as POR
+import qualified "numerals" Text.Numeral.Language.RUS as RUS
 import qualified "numerals" Text.Numeral.Language.SCO as SCO
-import qualified "numerals" Text.Numeral.Language.SV  as SV
-import qualified "numerals" Text.Numeral.Language.TR  as TR
-import qualified "numerals" Text.Numeral.Language.WO  as WO
+import qualified "numerals" Text.Numeral.Language.SPA as SPA
+import qualified "numerals" Text.Numeral.Language.SWE as SWE
+import qualified "numerals" Text.Numeral.Language.TUR as TUR
+import qualified "numerals" Text.Numeral.Language.WOL as WOL
 import qualified "numerals" Text.Numeral.Language.YOR as YOR
-import qualified "numerals" Text.Numeral.Language.ZH  as ZH
+import qualified "numerals" Text.Numeral.Language.ZHO as ZHO
 
 import qualified "this" Text.Numeral.Language.ACH.TestData as ACH
 import qualified "this" Text.Numeral.Language.ADY.TestData as ADY
-import qualified "this" Text.Numeral.Language.AF.TestData  as AF
+import qualified "this" Text.Numeral.Language.AFR.TestData as AFR
 import qualified "this" Text.Numeral.Language.AMP.TestData as AMP
 import qualified "this" Text.Numeral.Language.ARI.TestData as ARI
+import qualified "this" Text.Numeral.Language.ARN.TestData as ARN
 import qualified "this" Text.Numeral.Language.AST.TestData as AST
-import qualified "this" Text.Numeral.Language.AZ.TestData  as AZ
-import qualified "this" Text.Numeral.Language.BA.TestData  as BA
-import qualified "this" Text.Numeral.Language.BG.TestData  as BG
-import qualified "this" Text.Numeral.Language.BM.TestData  as BM
-import qualified "this" Text.Numeral.Language.CA.TestData  as CA
+import qualified "this" Text.Numeral.Language.AZE.TestData as AZE
+import qualified "this" Text.Numeral.Language.BAK.TestData as BAK
+import qualified "this" Text.Numeral.Language.BAM.TestData as BAM
+import qualified "this" Text.Numeral.Language.BUL.TestData as BUL
 import qualified "this" Text.Numeral.Language.CAF.TestData as CAF
+import qualified "this" Text.Numeral.Language.CAR.TestData as CAR
+import qualified "this" Text.Numeral.Language.CAT.TestData as CAT
 import qualified "this" Text.Numeral.Language.CBK.TestData as CBK
+import qualified "this" Text.Numeral.Language.CES.TestData as CES
 import qualified "this" Text.Numeral.Language.CHN.TestData as CHN
 import qualified "this" Text.Numeral.Language.CHR.TestData as CHR
+import qualified "this" Text.Numeral.Language.CKU.TestData as CKU
 import qualified "this" Text.Numeral.Language.CLM.TestData as CLM
-import qualified "this" Text.Numeral.Language.CO.TestData  as CO
+import qualified "this" Text.Numeral.Language.CRO.TestData as CRO
 import qualified "this" Text.Numeral.Language.COD.TestData as COD
 import qualified "this" Text.Numeral.Language.COO.TestData as COO
-import qualified "this" Text.Numeral.Language.CS.TestData  as CS
-import qualified "this" Text.Numeral.Language.CY.TestData  as CY
-import qualified "this" Text.Numeral.Language.DE.TestData  as DE
+import qualified "this" Text.Numeral.Language.COS.TestData as COS
+import qualified "this" Text.Numeral.Language.CRG.TestData as CRG
+import qualified "this" Text.Numeral.Language.CYM.TestData as CYM
+import qualified "this" Text.Numeral.Language.DEU.TestData as DEU
 import qualified "this" Text.Numeral.Language.DJK.TestData as DJK
-import qualified "this" Text.Numeral.Language.EN.TestData  as EN
-import qualified "this" Text.Numeral.Language.EO.TestData  as EO
-import qualified "this" Text.Numeral.Language.ES.TestData  as ES
-import qualified "this" Text.Numeral.Language.ET.TestData  as ET
-import qualified "this" Text.Numeral.Language.FI.TestData  as FI
-import qualified "this" Text.Numeral.Language.FO.TestData  as FO
-import qualified "this" Text.Numeral.Language.FR.TestData  as FR
+import qualified "this" Text.Numeral.Language.EKK.TestData as EKK
+import qualified "this" Text.Numeral.Language.EMI.TestData as EMI
+import qualified "this" Text.Numeral.Language.ENG.TestData as ENG
+import qualified "this" Text.Numeral.Language.EPO.TestData as EPO
+import qualified "this" Text.Numeral.Language.FAO.TestData as FAO
+import qualified "this" Text.Numeral.Language.FIN.TestData as FIN
+import qualified "this" Text.Numeral.Language.FRA.TestData as FRA
+import qualified "this" Text.Numeral.Language.FRA_JER.TestData as FRA_JER
+import qualified "this" Text.Numeral.Language.FRR.TestData as FRR
 import qualified "this" Text.Numeral.Language.FUR.TestData as FUR
 import qualified "this" Text.Numeral.Language.GCF_MTQ.TestData as GCF_MTQ
 import qualified "this" Text.Numeral.Language.GIL.TestData as GIL
-import qualified "this" Text.Numeral.Language.GL.TestData  as GL
+import qualified "this" Text.Numeral.Language.GLG.TestData as GLG
+import qualified "this" Text.Numeral.Language.GLV.TestData as GLV
 import qualified "this" Text.Numeral.Language.GSW.TestData as GSW
-import qualified "this" Text.Numeral.Language.GV.TestData  as GV
 import qualified "this" Text.Numeral.Language.HAI.TestData as HAI
-import qualified "this" Text.Numeral.Language.HE.TestData  as HE
+import qualified "this" Text.Numeral.Language.HAT.TestData as HAT
+import qualified "this" Text.Numeral.Language.HEB.TestData as HEB
 import qualified "this" Text.Numeral.Language.HOP.TestData as HOP
-import qualified "this" Text.Numeral.Language.HR.TestData  as HR
-import qualified "this" Text.Numeral.Language.HU.TestData  as HU
-import qualified "this" Text.Numeral.Language.HY.TestData  as HY
-import qualified "this" Text.Numeral.Language.IT.TestData  as IT
-import qualified "this" Text.Numeral.Language.JA.TestData  as JA
+import qualified "this" Text.Numeral.Language.HRV.TestData as HRV
+import qualified "this" Text.Numeral.Language.HUN.TestData as HUN
+import qualified "this" Text.Numeral.Language.HUP.TestData as HUP
+import qualified "this" Text.Numeral.Language.HUR.TestData as HUR
+import qualified "this" Text.Numeral.Language.HYE.TestData as HYE
+import qualified "this" Text.Numeral.Language.IBO.TestData as IBO
+import qualified "this" Text.Numeral.Language.IND.TestData as IND
+import qualified "this" Text.Numeral.Language.INH.TestData as INH
+import qualified "this" Text.Numeral.Language.ITA.TestData as ITA
+import qualified "this" Text.Numeral.Language.IZH.TestData as IZH
+import qualified "this" Text.Numeral.Language.JPN.TestData as JPN
 import qualified "this" Text.Numeral.Language.KAP.TestData as KAP
 import qualified "this" Text.Numeral.Language.KEA.TestData as KEA
-import qualified "this" Text.Numeral.Language.LA.TestData  as LA
+import qualified "this" Text.Numeral.Language.KLB.TestData as KLB
+import qualified "this" Text.Numeral.Language.KMR.TestData as KMR
+import qualified "this" Text.Numeral.Language.KRL.TestData as KRL
+import qualified "this" Text.Numeral.Language.LAT.TestData as LAT
+import qualified "this" Text.Numeral.Language.LAV.TestData as LAV
+import qualified "this" Text.Numeral.Language.LIN.TestData as LIN
+import qualified "this" Text.Numeral.Language.LIT.TestData as LIT
+import qualified "this" Text.Numeral.Language.LIV.TestData as LIV
 import qualified "this" Text.Numeral.Language.LLD.TestData as LLD
-import qualified "this" Text.Numeral.Language.MG.TestData  as MG
+import qualified "this" Text.Numeral.Language.LMO.TestData as LMO
+import qualified "this" Text.Numeral.Language.LTZ.TestData as LTZ
+import qualified "this" Text.Numeral.Language.MIC.TestData as MIC
+import qualified "this" Text.Numeral.Language.MIN.TestData as MIN
+import qualified "this" Text.Numeral.Language.MLG.TestData as MLG
+import qualified "this" Text.Numeral.Language.MNK.TestData as MNK
 import qualified "this" Text.Numeral.Language.MOH.TestData as MOH
-import qualified "this" Text.Numeral.Language.NL.TestData  as NL
-import qualified "this" Text.Numeral.Language.NO.TestData  as NO
+import qualified "this" Text.Numeral.Language.NAV.TestData as NAV
+import qualified "this" Text.Numeral.Language.NEE.TestData as NEE
+import qualified "this" Text.Numeral.Language.NEN.TestData as NEN
+import qualified "this" Text.Numeral.Language.NLD.TestData as NLD
+import qualified "this" Text.Numeral.Language.NOB.TestData as NOB
 import qualified "this" Text.Numeral.Language.NQM.TestData as NQM
-import qualified "this" Text.Numeral.Language.OJ.TestData  as OJ
+import qualified "this" Text.Numeral.Language.OCI.TestData as OCI
+import qualified "this" Text.Numeral.Language.OJI.TestData as OJI
+import qualified "this" Text.Numeral.Language.ONE.TestData as ONE
+import qualified "this" Text.Numeral.Language.ORM.TestData as ORM
 import qualified "this" Text.Numeral.Language.PAA.TestData as PAA
 import qualified "this" Text.Numeral.Language.PDC.TestData as PDC
-import qualified "this" Text.Numeral.Language.PL.TestData  as PL
-import qualified "this" Text.Numeral.Language.PT.TestData  as PT
+import qualified "this" Text.Numeral.Language.POL.TestData as POL
+import qualified "this" Text.Numeral.Language.POR.TestData as POR
 import qualified "this" Text.Numeral.Language.RMN_DZA.TestData as RMN_DZA
-import qualified "this" Text.Numeral.Language.RO.TestData  as RO
-import qualified "this" Text.Numeral.Language.RU.TestData  as RU
+import qualified "this" Text.Numeral.Language.RMY_KAL.TestData as RMY_KAL
+import qualified "this" Text.Numeral.Language.RON.TestData as RON
+import qualified "this" Text.Numeral.Language.RUS.TestData as RUS
 import qualified "this" Text.Numeral.Language.SCO.TestData as SCO
-import qualified "this" Text.Numeral.Language.SV.TestData  as SV
+import qualified "this" Text.Numeral.Language.SME.TestData as SME
+import qualified "this" Text.Numeral.Language.SMN.TestData as SMN
+import qualified "this" Text.Numeral.Language.SPA.TestData as SPA
+import qualified "this" Text.Numeral.Language.SQI.TestData as SQI
+import qualified "this" Text.Numeral.Language.SWE.TestData as SWE
 import qualified "this" Text.Numeral.Language.TAR.TestData as TAR
-import qualified "this" Text.Numeral.Language.TR.TestData  as TR
-import qualified "this" Text.Numeral.Language.WO.TestData  as WO
+import qualified "this" Text.Numeral.Language.TGS.TestData as TGS
+import qualified "this" Text.Numeral.Language.TUR.TestData as TUR
+import qualified "this" Text.Numeral.Language.WMW.TestData as WMW
+import qualified "this" Text.Numeral.Language.WOL.TestData as WOL
+import qualified "this" Text.Numeral.Language.XPQ.TestData as XPQ
 import qualified "this" Text.Numeral.Language.YOR.TestData as YOR
+import qualified "this" Text.Numeral.Language.ZAI.TestData as ZAI
 import qualified "this" Text.Numeral.Language.ZAQ.TestData as ZAQ
-import qualified "this" Text.Numeral.Language.ZH.TestData  as ZH
+import qualified "this" Text.Numeral.Language.ZHO.TestData as ZHO
 import qualified "this" Text.Numeral.Language.ZPC.TestData as ZPC
+import qualified "this" Text.Numeral.Language.ZPL.TestData as ZPL
 
 
 --------------------------------------------------------------------------------
 -- Test suite
 --------------------------------------------------------------------------------
 
-main ∷ IO ()
-main = do opts ← interpretArgsOrExit =<< getArgs
+main :: IO ()
+main = do opts <- interpretArgsOrExit =<< getArgs
           defaultMainWithOpts tests opts { ropt_hide_successes = Just True }
 
-tests ∷ [Test]
+tests :: [Test]
 tests =
   [ testGroup "Grammar"
     [ testGroup "Case"
@@ -200,394 +227,564 @@
     ]
   , testGroup "ACH"
     [ testGroup "unique data"
-      [testUnique "cardinal" (ACH.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (ACH.cardinals :: TestData Integer)]
     ]
   , testGroup "ADY"
     [ testGroup "unique data"
-      [testUnique "cardinal" (ADY.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (ADY.cardinals :: TestData Integer)]
     ]
   , testGroup "AF"
     [ testGroup "unique data"
-      [ testUnique "cardinal" (AF.cardinals ∷ TestData ℤ)
-      , testUnique "ordinal"  (AF.ordinals  ∷ TestData ℤ)
+      [ testUnique "cardinal" (AFR.cardinals :: TestData Integer)
+      , testUnique "ordinal"  (AFR.ordinals  :: TestData Integer)
       ]
-    , mkTests "cardinal" AF.cardinal (AF.cardinals ∷ TestData ℤ)
-    , mkTests "ordinal"  AF.ordinal  (AF.ordinals  ∷ TestData ℤ)
+    , mkTests "cardinal" AFR.cardinal (AFR.cardinals :: TestData Integer)
+    , mkTests "ordinal"  AFR.ordinal  (AFR.ordinals  :: TestData Integer)
     ]
   , testGroup "AMP"
     [ testGroup "unique data"
-      [testUnique "cardinal" (AMP.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" AMP.cardinal (AMP.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (AMP.cardinals :: TestData Integer)]
+    , mkTests "cardinal" AMP.cardinal (AMP.cardinals :: TestData Integer)
     ]
   , testGroup "ARI"
     [ testGroup "unique data"
-      [testUnique "cardinal" (ARI.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (ARI.cardinals :: TestData Integer)]
     ]
+  , testGroup "ARN"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (ARN.cardinals :: TestData Integer)]
+    ]
   , testGroup "AST"
     [ testGroup "unique data"
-      [testUnique "cardinal" (AST.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (AST.cardinals :: TestData Integer)]
     ]
-  , testGroup "AZ"
+  , testGroup "AZE"
     [ testGroup "unique data"
-      [testUnique "cardinal" (AZ.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (AZE.cardinals :: TestData Integer)]
     ]
-  , testGroup "BA"
+  , testGroup "BAK"
     [ testGroup "unique data"
-      [testUnique "cardinal" (BA.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (BAK.cardinals :: TestData Integer)]
     ]
-  , testGroup "BG"
+  , testGroup "BUL"
     [ testGroup "unique data"
-      [testUnique "cardinal" (BG.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" BG.cardinal (BG.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (BUL.cardinals :: TestData Integer)]
+    , mkTests "cardinal" BUL.cardinal (BUL.cardinals :: TestData Integer)
     ]
-  , testGroup "BM"
+  , testGroup "BAM"
     [ testGroup "unique data"
-      [testUnique "cardinal" (BM.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (BAM.cardinals :: TestData Integer)]
     ]
-  , testGroup "CA"
+  , testGroup "CAT"
     [ testGroup "unique data"
-      [testUnique "cardinal" (CA.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (CAT.cardinals :: TestData Integer)]
     ]
   , testGroup "CAF"
     [ testGroup "unique data"
-      [ testUnique "cardinal" (CAF.cardinals ∷ TestData ℤ)
-      , testUnique "cardinal (syllabic)" (CAF.syllabic_cardinals ∷ TestData ℤ)
+      [ testUnique "cardinal" (CAF.cardinals :: TestData Integer)
+      , testUnique "cardinal (syllabic)" (CAF.syllabic_cardinals :: TestData Integer)
       ]
     ]
+  , testGroup "CAR"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (CAR.cardinals :: TestData Integer)]
+    ]
   , testGroup "CBK"
     [ testGroup "unique data"
-      [testUnique "cardinal" (CBK.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (CBK.cardinals :: TestData Integer)]
     ]
   , testGroup "CHN"
     [ testGroup "unique data"
-      [testUnique "cardinal" (CHN.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" CHN.cardinal (CHN.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (CHN.cardinals :: TestData Integer)]
+    , mkTests "cardinal" CHN.cardinal (CHN.cardinals :: TestData Integer)
     ]
   , testGroup "CHR"
     [ testGroup "unique data"
-      [testUnique "cardinal" (CHR.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" CHR.cardinal (CHR.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (CHR.cardinals :: TestData Integer)]
+    , mkTests "cardinal" CHR.cardinal (CHR.cardinals :: TestData Integer)
     ]
+  , testGroup "CKU"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (CKU.cardinals :: TestData Integer)]
+    ]
   , testGroup "CLM"
     [ testGroup "unique data"
-      [testUnique "cardinal" (CLM.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" CLM.cardinal (CLM.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (CLM.cardinals :: TestData Integer)]
+    , mkTests "cardinal" CLM.cardinal (CLM.cardinals :: TestData Integer)
     ]
-  , testGroup "CO"
+  , testGroup "CRO"
     [ testGroup "unique data"
-      [testUnique "cardinal" (CO.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (CRO.cardinals :: TestData Integer)]
+    , mkTests "cardinal" CRO.cardinal (CRO.cardinals :: TestData Integer)
     ]
+  , testGroup "COS"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (COS.cardinals :: TestData Integer)]
+    ]
   , testGroup "COD"
     [ testGroup "unique data"
-      [testUnique "cardinal" (COD.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (COD.cardinals :: TestData Integer)]
     ]
   , testGroup "COO"
     [ testGroup "unique data"
-      [testUnique "cardinal" (COO.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (COO.cardinals :: TestData Integer)]
     ]
-  , testGroup "CS"
+  , testGroup "CRG"
     [ testGroup "unique data"
-      [testUnique "cardinal" (CS.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" CS.cardinal (CS.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (CRG.cardinals :: TestData Integer)]
     ]
-  , testGroup "CY"
+  , testGroup "CES"
     [ testGroup "unique data"
-      [testUnique "cardinal" (CY.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (CES.cardinals :: TestData Integer)]
+    , mkTests "cardinal" CES.cardinal (CES.cardinals :: TestData Integer)
     ]
-  , testGroup "DE"
+  , testGroup "CYM"
     [ testGroup "unique data"
-      [ testUnique "cardinal" (DE.cardinals ∷ TestData ℤ)
-      , testUnique "ordinal"  (DE.ordinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (CYM.cardinals :: TestData Integer)]
+    ]
+  , testGroup "DEU"
+    [ testGroup "unique data"
+      [ testUnique "cardinal" (DEU.cardinals :: TestData Integer)
+      , testUnique "ordinal"  (DEU.ordinals  :: TestData Integer)
       ]
-    , mkTests "cardinal" DE.cardinal (DE.cardinals ∷ TestData ℤ)
-    , mkTests "ordinal"  DE.ordinal  (DE.ordinals  ∷ TestData ℤ)
+    , mkTests "cardinal" DEU.cardinal (DEU.cardinals :: TestData Integer)
+    , mkTests "ordinal"  DEU.ordinal  (DEU.ordinals  :: TestData Integer)
     ]
   , testGroup "DJK"
     [ testGroup "unique data"
-      [testUnique "cardinal" (DJK.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (DJK.cardinals :: TestData Integer)]
     ]
-  , testGroup "EN"
+  , testGroup "EMI"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (EMI.cardinals :: TestData Integer)]
+    ]
+  , testGroup "ENG"
     [ testGroup "GB"
       [ testGroup "unique data"
-        [ testUnique "cardinal" (EN.gb_cardinals ∷ TestData ℤ)
-        , testUnique "ordinal"  (EN.gb_ordinals  ∷ TestData ℤ)
+        [ testUnique "cardinal" (ENG.gb_cardinals :: TestData Integer)
+        , testUnique "ordinal"  (ENG.gb_ordinals  :: TestData Integer)
         ]
-      , mkTests "cardinal" EN.gb_cardinal (EN.gb_cardinals ∷ TestData ℤ)
-      , mkTests "ordinal"  EN.gb_ordinal  (EN.gb_ordinals  ∷ TestData ℤ)
+      , mkTests "cardinal" ENG.gb_cardinal (ENG.gb_cardinals :: TestData Integer)
+      , mkTests "ordinal"  ENG.gb_ordinal  (ENG.gb_ordinals  :: TestData Integer)
       ]
     , testGroup "US"
       [ testGroup "unique data"
-        [ testUnique "cardinal" (EN.us_cardinals ∷ TestData ℤ)
-        , testUnique "ordinal"  (EN.us_ordinals  ∷ TestData ℤ)
+        [ testUnique "cardinal" (ENG.us_cardinals :: TestData Integer)
+        , testUnique "ordinal"  (ENG.us_ordinals  :: TestData Integer)
         ]
-      , mkTests "cardinal" EN.us_cardinal (EN.us_cardinals ∷ TestData ℤ)
-      , mkTests "ordinal"  EN.us_ordinal  (EN.us_ordinals  ∷ TestData ℤ)
+      , mkTests "cardinal" ENG.us_cardinal (ENG.us_cardinals :: TestData Integer)
+      , mkTests "ordinal"  ENG.us_ordinal  (ENG.us_ordinals  :: TestData Integer)
       ]
     ]
-  , testGroup "EO"
+  , testGroup "EPO"
     [ testGroup "unique data"
-      [testUnique "cardinal" (EO.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" EO.cardinal (EO.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (EPO.cardinals :: TestData Integer)]
+    , mkTests "cardinal" EPO.cardinal (EPO.cardinals :: TestData Integer)
     ]
-  , testGroup "ES"
+  , testGroup "SPA"
     [ testGroup "unique data"
-      [testUnique "cardinal" (ES.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" ES.cardinal (ES.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (SPA.cardinals :: TestData Integer)]
+    , mkTests "cardinal" SPA.cardinal (SPA.cardinals :: TestData Integer)
     ]
-  , testGroup "ET"
+  , testGroup "SQI"
     [ testGroup "unique data"
-      [testUnique "cardinal" (ET.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (SQI.cardinals :: TestData Integer)]
     ]
-  , testGroup "FI"
+  , testGroup "EKK"
     [ testGroup "unique data"
-      [ testUnique "cardinal" (FI.cardinals ∷ TestData ℤ)
-      , testUnique "ordinal"  (FI.ordinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (EKK.cardinals :: TestData Integer)]
+    ]
+  , testGroup "FIN"
+    [ testGroup "unique data"
+      [ testUnique "cardinal" (FIN.cardinals :: TestData Integer)
+      , testUnique "ordinal"  (FIN.ordinals  :: TestData Integer)
       ]
-    , mkTests "cardinal" FI.cardinal (FI.cardinals ∷ TestData ℤ)
-    , mkTests "ordinal"  FI.ordinal  (FI.ordinals ∷ TestData ℤ)
+    , mkTests "cardinal" FIN.cardinal (FIN.cardinals :: TestData Integer)
+    , mkTests "ordinal"  FIN.ordinal  (FIN.ordinals :: TestData Integer)
     ]
-  , testGroup "FO"
+  , testGroup "FAO"
     [ testGroup "unique data"
-      [testUnique "cardinal" (FO.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (FAO.cardinals :: TestData Integer)]
     ]
-  , testGroup "FR"
+  , testGroup "FRA"
     [ testGroup "unique data"
-      [ testUnique "cardinal" (FR.cardinals ∷ TestData ℤ)
-      , testUnique "ordinal"  (FR.ordinals  ∷ TestData ℤ)
+      [ testUnique "cardinal" (FRA.cardinals :: TestData Integer)
+      , testUnique "ordinal"  (FRA.ordinals  :: TestData Integer)
       ]
-    , mkTests "cardinal" FR.cardinal (FR.cardinals ∷ TestData ℤ)
-    , mkTests "ordinal"  FR.ordinal  (FR.ordinals  ∷ TestData ℤ)
+    , mkTests "cardinal" FRA.cardinal (FRA.cardinals :: TestData Integer)
+    , mkTests "ordinal"  FRA.ordinal  (FRA.ordinals  :: TestData Integer)
     ]
+  , testGroup "FRR"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (FRR.cardinals :: TestData Integer)]
+    ]
+  , testGroup "FRA_JER"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (FRA_JER.cardinals :: TestData Integer)]
+    ]
   , testGroup "FUR"
     [ testGroup "unique data"
-      [testUnique "cardinal" (FUR.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" FUR.cardinal (FUR.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (FUR.cardinals :: TestData Integer)]
+    , mkTests "cardinal" FUR.cardinal (FUR.cardinals :: TestData Integer)
    ]
   , testGroup "GCF_MTQ"
     [ testGroup "unique data"
-      [testUnique "cardinal" (GCF_MTQ.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (GCF_MTQ.cardinals :: TestData Integer)]
     ]
   , testGroup "GIL"
     [ testGroup "unique data"
-      [testUnique "cardinal" (GIL.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (GIL.cardinals :: TestData Integer)]
     ]
-  , testGroup "GL"
+  , testGroup "GLG"
     [ testGroup "unique data"
-      [testUnique "cardinal" (GL.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (GLG.cardinals :: TestData Integer)]
     ]
   , testGroup "GSW"
     [ testGroup "unique data"
-      [testUnique "cardinal" (GSW.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" GSW.cardinal (GSW.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (GSW.cardinals :: TestData Integer)]
+    , mkTests "cardinal" GSW.cardinal (GSW.cardinals :: TestData Integer)
     ]
-  , testGroup "GV"
+  , testGroup "GLV"
     [ testGroup "unique data"
-      [testUnique "cardinal" (GV.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" GV.cardinal  (GV.cardinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (GLV.cardinals :: TestData Integer)]
+    , mkTests "cardinal" GLV.cardinal  (GLV.cardinals  :: TestData Integer)
     ]
   , testGroup "HAI"
     [ testGroup "unique data"
-      [testUnique "cardinal" (HAI.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (HAI.cardinals :: TestData Integer)]
     ]
-  , testGroup "HE"
+  , testGroup "HEB"
     [ testGroup "unique data"
-      [testUnique "cardinal" (HE.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" HE.cardinal  (HE.cardinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (HEB.cardinals :: TestData Integer)]
+    , mkTests "cardinal" HEB.cardinal  (HEB.cardinals  :: TestData Integer)
     ]
   , testGroup "HOP"
     [ testGroup "unique data"
-      [testUnique "cardinal" (HOP.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" HOP.cardinal (HOP.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (HOP.cardinals :: TestData Integer)]
+    , mkTests "cardinal" HOP.cardinal (HOP.cardinals :: TestData Integer)
     ]
-  , testGroup "HR"
+  , testGroup "HRV"
     [ testGroup "unique data"
-      [testUnique "cardinal" (HR.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (HRV.cardinals :: TestData Integer)]
     ]
-  , testGroup "HU"
+  , testGroup "HAT"
     [ testGroup "unique data"
-      [testUnique "cardinal" (HU.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (HAT.cardinals :: TestData Integer)]
     ]
-  , testGroup "HY"
+  , testGroup "HUN"
     [ testGroup "unique data"
-      [testUnique "cardinal" (HY.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (HUN.cardinals :: TestData Integer)]
     ]
-  , testGroup "IT"
+  , testGroup "HUP"
     [ testGroup "unique data"
-      [testUnique "cardinal" (IT.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" IT.cardinal (IT.cardinals ∷ TestData ℤ)
-    , mkTests "ordinal"  IT.ordinal  (IT.ordinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (HUP.cardinals :: TestData Integer)]
     ]
-  , testGroup "JA"
+  , testGroup "HUR"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (HUR.cardinals :: TestData Integer)]
+    ]
+  , testGroup "HYE"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (HYE.cardinals :: TestData Integer)]
+    ]
+  , testGroup "IND"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (IND.cardinals :: TestData Integer)]
+    ]
+  , testGroup "IBO"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (IBO.cardinals :: TestData Integer)]
+    ]
+  , testGroup "INH"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (INH.cardinals :: TestData Integer)]
+    ]
+  , testGroup "ITA"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (ITA.cardinals :: TestData Integer)]
+    , mkTests "cardinal" ITA.cardinal (ITA.cardinals :: TestData Integer)
+    , mkTests "ordinal"  ITA.ordinal  (ITA.ordinals  :: TestData Integer)
+    ]
+  , testGroup "IZH"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (IZH.cardinals :: TestData Integer)]
+    ]
+  , testGroup "JPN"
     [ testGroup "preferred"
       [ testGroup "unique data"
-        [testUnique "cardinal" (JA.preferred_cardinals ∷ TestData ℤ)]
-      , mkTests "cardinal" JA.preferred_cardinal
-                          (JA.preferred_cardinals ∷ TestData ℤ)
+        [testUnique "cardinal" (JPN.preferred_cardinals :: TestData Integer)]
+      , mkTests "cardinal" JPN.preferred_cardinal
+                          (JPN.preferred_cardinals :: TestData Integer)
       ]
     , testGroup "kanji"
       [ testGroup "unique data"
-        [testUnique "cardinal" (JA.kanji_cardinals ∷ TestData ℤ)]
-      , mkTests "cardinal" JA.kanji_cardinal (JA.kanji_cardinals ∷ TestData ℤ)
+        [testUnique "cardinal" (JPN.kanji_cardinals :: TestData Integer)]
+      , mkTests "cardinal" JPN.kanji_cardinal (JPN.kanji_cardinals :: TestData Integer)
       ]
     , testGroup "daiji"
       [ testGroup "unique data"
-        [testUnique "cardinal" (JA.daiji_cardinals ∷ TestData ℤ)]
-      , mkTests "cardinal" JA.daiji_cardinal (JA.daiji_cardinals ∷ TestData ℤ)
+        [testUnique "cardinal" (JPN.daiji_cardinals :: TestData Integer)]
+      , mkTests "cardinal" JPN.daiji_cardinal (JPN.daiji_cardinals :: TestData Integer)
       ]
     ]
   , testGroup "KAP"
     [ testGroup "unique data"
-      [testUnique "cardinal" (KAP.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (KAP.cardinals :: TestData Integer)]
     ]
   , testGroup "KEA"
     [ testGroup "unique data"
-      [testUnique "cardinal" (KEA.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (KEA.cardinals :: TestData Integer)]
     ]
-  , testGroup "LA"
+  , testGroup "KLB"
     [ testGroup "unique data"
-      [testUnique "cardinal" (LA.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" LA.cardinal (LA.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (KLB.cardinals :: TestData Integer)]
     ]
+  , testGroup "KMR"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (KMR.cardinals :: TestData Integer)]
+    ]
+  , testGroup "KRL"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (KRL.cardinals :: TestData Integer)]
+    ]
+  , testGroup "LAT"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (LAT.cardinals :: TestData Integer)]
+    , mkTests "cardinal" LAT.cardinal (LAT.cardinals :: TestData Integer)
+    ]
+  , testGroup "LTZ"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (LTZ.cardinals :: TestData Integer)]
+    ]
+  , testGroup "LIV"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (LIV.cardinals :: TestData Integer)]
+    ]
   , testGroup "LLD"
     [ testGroup "unique data"
-      [testUnique "cardinal" (LLD.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" LLD.cardinal (LLD.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (LLD.cardinals :: TestData Integer)]
+    , mkTests "cardinal" LLD.cardinal (LLD.cardinals :: TestData Integer)
     ]
-  , testGroup "MG"
+  , testGroup "LMO"
     [ testGroup "unique data"
-      [testUnique "cardinal" (MG.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" MG.cardinal (MG.cardinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (LMO.cardinals :: TestData Integer)]
     ]
+  , testGroup "LIN"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (LIN.cardinals :: TestData Integer)]
+    ]
+  , testGroup "LIT"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (LIT.cardinals :: TestData Integer)]
+    ]
+  , testGroup "LAV"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (LAV.cardinals :: TestData Integer)]
+    ]
+  , testGroup "MLG"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (MLG.cardinals :: TestData Integer)]
+    , mkTests "cardinal" MLG.cardinal (MLG.cardinals  :: TestData Integer)
+    ]
+  , testGroup "MIC"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (MIC.cardinals :: TestData Integer)]
+    ]
+  , testGroup "MIN"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (MIN.cardinals :: TestData Integer)]
+    ]
+  , testGroup "MNK"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (MNK.cardinals :: TestData Integer)]
+    ]
   , testGroup "MOH"
     [ testGroup "unique data"
-      [testUnique "cardinal" (MOH.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (MOH.cardinals :: TestData Integer)]
     ]
-  , testGroup "NL"
+  , testGroup "NEE"
     [ testGroup "unique data"
-      [ testUnique "cardinal"       (NL.cardinals       ∷ TestData ℤ)
-      , testUnique "ordinal"        (NL.ordinals        ∷ TestData ℤ)
-      , testUnique "partitive"      (NL.partitives      ∷ TestData (ℤ, ℤ))
-      , testUnique "multiplicative" (NL.multiplicatives ∷ TestData ℤ)
+      [testUnique "cardinal" (NEE.cardinals :: TestData Integer)]
+    ]
+  , testGroup "NEN"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (NEN.cardinals :: TestData Integer)]
+    , mkTests "cardinal" NEN.cardinal (NEN.cardinals :: TestData Integer)
+    ]
+  , testGroup "NLD"
+    [ testGroup "unique data"
+      [ testUnique "cardinal"       (NLD.cardinals       :: TestData Integer)
+      , testUnique "ordinal"        (NLD.ordinals        :: TestData Integer)
+      , testUnique "partitive"      (NLD.partitives      :: TestData (Integer, Integer))
+      , testUnique "multiplicative" (NLD.multiplicatives :: TestData Integer)
       ]
-    , mkTests "cardinal"       NL.cardinal  (NL.cardinals  ∷ TestData ℤ)
-    , mkTests "ordinal"        NL.ordinal   (NL.ordinals   ∷ TestData ℤ)
-    , mkTests "partitive"      NL.partitive (NL.partitives ∷ TestData (ℤ, ℤ))
-    , mkTests "multiplicative" NL.multiplicative (NL.multiplicatives ∷ TestData ℤ)
+    , mkTests "cardinal"       NLD.cardinal  (NLD.cardinals  :: TestData Integer)
+    , mkTests "ordinal"        NLD.ordinal   (NLD.ordinals   :: TestData Integer)
+    , mkTests "partitive"      NLD.partitive (NLD.partitives :: TestData (Integer, Integer))
+    , mkTests "multiplicative" NLD.multiplicative (NLD.multiplicatives :: TestData Integer)
     ]
-  , testGroup "NO"
+  , testGroup "NOB"
     [ testGroup "unique data"
-      [testUnique "cardinal" (NO.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" NO.cardinal  (NO.cardinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (NOB.cardinals :: TestData Integer)]
+    , mkTests "cardinal" NOB.cardinal (NOB.cardinals  :: TestData Integer)
     ]
   , testGroup "NQM"
     [ testGroup "unique data"
-      [testUnique "cardinal" (NQM.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" NQM.cardinal (NQM.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (NQM.cardinals :: TestData Integer)]
+    , mkTests "cardinal" NQM.cardinal (NQM.cardinals :: TestData Integer)
     ]
-  , testGroup "OJ"
+  , testGroup "NAV"
     [ testGroup "unique data"
-      [testUnique "cardinal" (OJ.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" OJ.cardinal  (OJ.cardinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (NAV.cardinals :: TestData Integer)]
     ]
+  , testGroup "OCI"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (OCI.cardinals :: TestData Integer)]
+    ]
+  , testGroup "OJI"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (OJI.cardinals :: TestData Integer)]
+    , mkTests "cardinal" OJI.cardinal (OJI.cardinals  :: TestData Integer)
+    ]
+  , testGroup "ONE"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (ONE.cardinals :: TestData Integer)]
+    ]
+  , testGroup "ORM"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (ORM.cardinals :: TestData Integer)]
+    ]
   , testGroup "PAA"
     [ testGroup "unique data"
-      [testUnique "cardinal" (PAA.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (PAA.cardinals :: TestData Integer)]
     ]
   , testGroup "PDC"
     [ testGroup "unique data"
-      [testUnique "cardinal" (PDC.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" PDC.cardinal (PDC.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (PDC.cardinals :: TestData Integer)]
+    , mkTests "cardinal" PDC.cardinal (PDC.cardinals :: TestData Integer)
     ]
-  , testGroup "PL"
+  , testGroup "POL"
     [ testGroup "unique data"
-      [testUnique "cardinal" (PL.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" PL.cardinal  (PL.cardinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (POL.cardinals :: TestData Integer)]
+    , mkTests "cardinal" POL.cardinal (POL.cardinals  :: TestData Integer)
     ]
-  , testGroup "PT"
+  , testGroup "POR"
     [ testGroup "unique data"
-      [testUnique "cardinal" (PT.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" PT.cardinal (PT.cardinals  ∷ TestData ℤ)
-    , mkTests "ordinal"  PT.ordinal  (PT.ordinals   ∷ TestData ℤ)
+      [testUnique "cardinal" (POR.cardinals :: TestData Integer)]
+    , mkTests "cardinal" POR.cardinal (POR.cardinals  :: TestData Integer)
+    , mkTests "ordinal"  POR.ordinal  (POR.ordinals   :: TestData Integer)
     ]
   , testGroup "RMN_DZA"
     [ testGroup "unique data"
-      [testUnique "cardinal" (RMN_DZA.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (RMN_DZA.cardinals :: TestData Integer)]
     ]
-  , testGroup "RO"
+  , testGroup "RMY_KAL"
     [ testGroup "unique data"
-      [testUnique "cardinal" (RO.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (RMY_KAL.cardinals :: TestData Integer)]
     ]
-  , testGroup "RU"
+  , testGroup "RON"
     [ testGroup "unique data"
-      [testUnique "cardinal" (RU.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" RU.cardinal  (RU.cardinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (RON.cardinals :: TestData Integer)]
     ]
+  , testGroup "RUS"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (RUS.cardinals :: TestData Integer)]
+    , mkTests "cardinal" RUS.cardinal (RUS.cardinals  :: TestData Integer)
+    ]
   , testGroup "SCO"
     [ testGroup "unique data"
-      [testUnique "cardinal" (SCO.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" SCO.cardinal (SCO.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (SCO.cardinals :: TestData Integer)]
+    , mkTests "cardinal" SCO.cardinal (SCO.cardinals :: TestData Integer)
     ]
-  , testGroup "SV"
+  , testGroup "SME"
     [ testGroup "unique data"
-      [ testUnique "cardinal" (SV.cardinals ∷ TestData ℤ)
-      , testUnique "ordinal"  (SV.ordinals  ∷ TestData ℤ)
+      [testUnique "cardinal" (SME.cardinals :: TestData Integer)]
+    ]
+  , testGroup "SMN"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (SMN.cardinals :: TestData Integer)]
+    ]
+  , testGroup "SWE"
+    [ testGroup "unique data"
+      [ testUnique "cardinal" (SWE.cardinals :: TestData Integer)
+      , testUnique "ordinal"  (SWE.ordinals  :: TestData Integer)
       ]
-    , mkTests "cardinal" SV.cardinal (SV.cardinals ∷ TestData ℤ)
-    , mkTests "ordinal"  SV.ordinal  (SV.ordinals  ∷ TestData ℤ)
+    , mkTests "cardinal" SWE.cardinal (SWE.cardinals :: TestData Integer)
+    , mkTests "ordinal"  SWE.ordinal  (SWE.ordinals  :: TestData Integer)
     ]
   , testGroup "TAR"
     [ testGroup "unique data"
-      [testUnique "cardinal" (TAR.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (TAR.cardinals :: TestData Integer)]
     ]
-  , testGroup "TR"
+  , testGroup "TGS"
     [ testGroup "unique data"
-      [testUnique "cardinal" (TR.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" TR.cardinal (TR.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (TGS.cardinals :: TestData Integer)]
     ]
-  , testGroup "WO"
+  , testGroup "TUR"
     [ testGroup "unique data"
-      [testUnique "cardinal" (WO.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" WO.cardinal (WO.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (TUR.cardinals :: TestData Integer)]
+    , mkTests "cardinal" TUR.cardinal (TUR.cardinals :: TestData Integer)
     ]
+  , testGroup "WMW"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (WMW.cardinals :: TestData Integer)]
+    ]
+  , testGroup "WOL"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (WOL.cardinals :: TestData Integer)]
+    , mkTests "cardinal" WOL.cardinal (WOL.cardinals :: TestData Integer)
+    ]
+  , testGroup "XPQ"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (XPQ.cardinals :: TestData Integer)]
+    ]
   , testGroup "YOR"
     [ testGroup "unique data"
-      [testUnique "cardinal" (YOR.cardinals ∷ TestData ℤ)]
-    , mkTests "cardinal" YOR.cardinal (YOR.cardinals ∷ TestData ℤ)
+      [testUnique "cardinal" (YOR.cardinals :: TestData Integer)]
+    , mkTests "cardinal" YOR.cardinal (YOR.cardinals :: TestData Integer)
     ]
+  , testGroup "ZAI"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (ZAI.cardinals :: TestData Integer)]
+    ]
   , testGroup "ZAQ"
     [ testGroup "unique data"
-      [testUnique "cardinal" (ZAQ.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (ZAQ.cardinals :: TestData Integer)]
     ]
-  , testGroup "ZH"
+  , testGroup "ZHO"
     [ testGroup "characters (traditional)"
       [ testGroup "unique data"
-        [testUnique "cardinal" (ZH.trad_cardinals ∷ TestData ℤ)]
-      , mkTests "cardinal" ZH.trad_cardinal (ZH.trad_cardinals ∷ TestData ℤ)
+        [testUnique "cardinal" (ZHO.trad_cardinals :: TestData Integer)]
+      , mkTests "cardinal" ZHO.trad_cardinal (ZHO.trad_cardinals :: TestData Integer)
       ]
     , testGroup "characters (simplified)"
       [ testGroup "unique data"
-        [testUnique "cardinal" (ZH.simpl_cardinals ∷ TestData ℤ)]
-      , mkTests "cardinal" ZH.simpl_cardinal (ZH.simpl_cardinals ∷ TestData ℤ)
+        [testUnique "cardinal" (ZHO.simpl_cardinals :: TestData Integer)]
+      , mkTests "cardinal" ZHO.simpl_cardinal (ZHO.simpl_cardinals :: TestData Integer)
       ]
     , testGroup "financial characters (traditional)"
       [ testGroup "unique data"
-        [testUnique "cardinal" (ZH.finance_trad_cardinals ∷ TestData ℤ)]
-      , mkTests "cardinal" ZH.finance_trad_cardinal (ZH.finance_trad_cardinals ∷ TestData ℤ)
+        [testUnique "cardinal" (ZHO.finance_trad_cardinals :: TestData Integer)]
+      , mkTests "cardinal" ZHO.finance_trad_cardinal (ZHO.finance_trad_cardinals :: TestData Integer)
       ]
     , testGroup "financial characters (simplified)"
       [ testGroup "unique data"
-        [testUnique "cardinal" (ZH.finance_simpl_cardinals ∷ TestData ℤ)]
-      , mkTests "cardinal" ZH.finance_simpl_cardinal (ZH.finance_simpl_cardinals ∷ TestData ℤ)
+        [testUnique "cardinal" (ZHO.finance_simpl_cardinals :: TestData Integer)]
+      , mkTests "cardinal" ZHO.finance_simpl_cardinal (ZHO.finance_simpl_cardinals :: TestData Integer)
       ]
     , testGroup "pinyin"
       [ testGroup "unique data"
-        [testUnique "cardinal" (ZH.pinyin_cardinals ∷ TestData ℤ)]
-      , mkTests "cardinal" ZH.pinyin_cardinal (ZH.pinyin_cardinals ∷ TestData ℤ)
+        [testUnique "cardinal" (ZHO.pinyin_cardinals :: TestData Integer)]
+      , mkTests "cardinal" ZHO.pinyin_cardinal (ZHO.pinyin_cardinals :: TestData Integer)
       ]
+    ]
   , testGroup "ZPC"
     [ testGroup "unique data"
-      [testUnique "cardinal" (ZPC.cardinals ∷ TestData ℤ)]
+      [testUnique "cardinal" (ZPC.cardinals :: TestData Integer)]
     ]
+  , testGroup "ZPL"
+    [ testGroup "unique data"
+      [testUnique "cardinal" (ZPL.cardinals :: TestData Integer)]
     ]
   ]
 
@@ -598,7 +795,7 @@
 
 {-
 -- TODO: this takes way to long for large values (10 ^ 60000 - 1)
-testBounds ∷ Text → (ℤ → Maybe Text) → (ℤ, ℤ) → Test
+testBounds :: Text -> (Integer -> Maybe Text) -> (Integer, Integer) -> Test
 testBounds name conversion bounds@(lo, hi) =
       testGroup name
                 [ testCase "lower bound" $ assertBool "conversion error" $ checkConv lo
@@ -606,68 +803,68 @@
                 -- , testProperty "in between" $ forAll (choose bounds) checkConv
                 ]
     where
-      checkConv ∷ ℤ → Bool
-      checkConv = isJust ∘ conversion
+      checkConv :: Integer -> Bool
+      checkConv = isJust . conversion
 -}
 
-testInf ∷ (GR.Inflection → GR.Inflection) → (GR.Inflection → Bool) → Assertion
-testInf set test = assertBool "False" $ test $ set GR.defaultInflection
+testInf :: (Inflection -> Inflection) -> (Inflection -> Bool) -> Assertion
+testInf set test = assertBool "False" $ test $ set defaultInflection
 
-intLog_pow10 ∷ Positive ℤ → Bool
-intLog_pow10 (Positive x) = x ≡ intLog (dec x)
+intLog_pow10 :: Positive Integer -> Bool
+intLog_pow10 (Positive x) = x == intLog (dec x)
 
-intLog_pow10m1 ∷ NonNegative ℤ → Bool
-intLog_pow10m1 (NonNegative x) = x - 1 ≡ intLog (dec x) - 1
+intLog_pow10m1 :: NonNegative Integer -> Bool
+intLog_pow10m1 (NonNegative x) = x - 1 == intLog (dec x) - 1
 
-intLog_mul ∷ Positive ℤ → Positive ℤ → Bool
-intLog_mul (Positive x) (Positive y) = intLog (dec x ⋅ dec y) ≡ intLog (dec x) + intLog (dec y)
+intLog_mul :: Positive Integer -> Positive Integer -> Bool
+intLog_mul (Positive x) (Positive y) = intLog (dec x * dec y) == intLog (dec x) + intLog (dec y)
 
-mkTests ∷ ∀ α. (Show α)
-        ⇒ String
-        → (GR.Inflection → α → Maybe Text)
-        → TestData α
-        → Test
-mkTests name f = testGroup name ∘ map perInflection
+mkTests :: forall a. (Show a)
+        => String
+        -> (Inflection -> a -> Maybe Text)
+        -> TestData a
+        -> Test
+mkTests name f = testGroup name . map perInflection
   where
-    perInflection ∷ (String, GR.Inflection, [(α, Text)]) → Test
+    perInflection :: (String, Inflection, [(a, Text)]) -> Test
     perInflection (infName, inf, xs) = testGroup infName $ map (perValue inf) xs
 
-    perValue ∷ GR.Inflection → (α, Text) → Test
+    perValue :: Inflection -> (a, Text) -> Test
     perValue inf (n, s) = testCase (show n) $ testConversion f inf n s
 
 -- | Tests whether the test data contains duplicates (different
 -- numbers with the same representation).
-testUnique ∷ ∀ α. (Show α) ⇒ String → TestData α → Test
-testUnique name = testGroup name ∘ map perInflection
+testUnique :: forall a. (Show a) => String -> TestData a -> Test
+testUnique name = testGroup name . map perInflection
   where
-    perInflection ∷ (String, inf, [(α, Text)]) → Test
+    perInflection :: (String, inf, [(a, Text)]) -> Test
     perInflection (infName, _, xs) = testCase infName $ unique xs
 
-    unique ∷ [(α, Text)] → Assertion
+    unique :: [(a, Text)] -> Assertion
     unique xs = when (length ys > 0)
                   $ assertFailure
                   $ intercalate "\n" $ map msg ys
       where
-        ys ∷ [[(α, Text)]]
-        ys = filter ((1 <) ∘ length)
-             $ groupBy ((≡) `on` snd)
+        ys :: [[(a, Text)]]
+        ys = filter ((1 <) . length)
+             $ groupBy ((==) `on` snd)
              $ sortBy (compare `on` snd) xs
 
-    msg ∷ [(α, Text)] → String
+    msg :: [(a, Text)] -> String
     msg xs = let (_, s) = head xs
              in printf "The string \"%s\" is associated with multiple values: %s"
                        (T.unpack s)
-                       (intercalate ", " $ map (show ∘ fst) xs)
+                       (intercalate ", " $ map (show . fst) xs)
 
-testConversion ∷ (Show α)
-               ⇒ (GR.Inflection → α → Maybe Text)
-               → GR.Inflection
-               → α
-               → Text
-               → Assertion
+testConversion :: (Show a)
+               => (Inflection -> a -> Maybe Text)
+               -> Inflection
+               -> a
+               -> Text
+               -> Assertion
 testConversion f inf n s =
   let r = f inf n
-  in when (r ≢ Just s)
+  in when (r /= Just s)
         $ assertFailure
         $ printf "Expected %s = \"%s\" but got \"%s\""
                  (show n)
diff --git a/src/GHC/Integer/Logarithms/Compat.hs b/src/GHC/Integer/Logarithms/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Integer/Logarithms/Compat.hs
@@ -0,0 +1,120 @@
+{-# LANGUAGE CPP, MagicHash, UnboxedTuples #-}
+
+module GHC.Integer.Logarithms.Compat
+    ( integerLog2#
+    , wordLog2#
+    ) where
+
+#if __GLASGOW_HASKELL__ >= 702
+import GHC.Integer.Logarithms (integerLog2#, wordLog2#)
+#else
+#include "MachDeps.h"
+
+import GHC.Integer.GMP.Internals (Integer(S#, J#))
+
+import GHC.Base ( indexWordArray#, uncheckedIShiftL#, indexInt8Array#
+                , word2Int#, ByteArray#, newByteArray#, writeInt8Array#
+                , (==#), (<#), (+#), (*#)
+                , unsafeFreezeByteArray#, realWorld#
+                , neWord#, (-#), uncheckedShiftRL#
+                , Int#, Word#, int2Word#
+                )
+
+#if (WORD_SIZE_IN_BITS != 32) && (WORD_SIZE_IN_BITS != 64)
+#error Only word sizes 32 and 64 are supported.
+#endif
+
+
+#if WORD_SIZE_IN_BITS == 32
+
+#define WSHIFT 5
+#define MMASK 31
+
+#else
+
+#define WSHIFT 6
+#define MMASK 63
+
+#endif
+
+-- | Calculate the integer base 2 logarithm of an 'Integer'.
+--   The calculation is much more efficient than for the general case.
+--
+--   The argument must be strictly positive, that condition is /not/ checked.
+integerLog2# :: Integer -> Int#
+integerLog2# (S# i) = wordLog2# (int2Word# i)
+integerLog2# (J# s ba) = check (s -# 1#)
+  where
+    check i = case indexWordArray# ba i of
+                0## -> check (i -# 1#)
+                w   -> wordLog2# w +# (uncheckedIShiftL# i WSHIFT#)
+
+-- | This function calculates the integer base 2 logarithm of a 'Word#'.
+--   @'wordLog2#' 0## = -1#@.
+{-# INLINE wordLog2# #-}
+wordLog2# :: Word# -> Int#
+wordLog2# w =
+  case leadingZeros of
+   BA lz ->
+    let zeros u = indexInt8Array# lz (word2Int# u) in
+#if WORD_SIZE_IN_BITS == 64
+    case uncheckedShiftRL# w 56# of
+     a ->
+      if a `neWord#` 0##
+       then 64# -# zeros a
+       else
+        case uncheckedShiftRL# w 48# of
+         b ->
+          if b `neWord#` 0##
+           then 56# -# zeros b
+           else
+            case uncheckedShiftRL# w 40# of
+             c ->
+              if c `neWord#` 0##
+               then 48# -# zeros c
+               else
+                case uncheckedShiftRL# w 32# of
+                 d ->
+                  if d `neWord#` 0##
+                   then 40# -# zeros d
+                   else
+#endif
+                    case uncheckedShiftRL# w 24# of
+                     e ->
+                      if e `neWord#` 0##
+                       then 32# -# zeros e
+                       else
+                        case uncheckedShiftRL# w 16# of
+                         f ->
+                          if f `neWord#` 0##
+                           then 24# -# zeros f
+                           else
+                            case uncheckedShiftRL# w 8# of
+                             g ->
+                              if g `neWord#` 0##
+                               then 16# -# zeros g
+                               else 8# -# zeros w
+
+-- Lookup table
+data BA = BA ByteArray#
+
+leadingZeros :: BA
+leadingZeros =
+    let mkArr s =
+          case newByteArray# 256# s of
+            (# s1, mba #) ->
+              case writeInt8Array# mba 0# 9# s1 of
+                s2 ->
+                  let fillA lim val idx st =
+                        if idx ==# 256#
+                          then st
+                          else if idx <# lim
+                                then case writeInt8Array# mba idx val st of
+                                        nx -> fillA lim val (idx +# 1#) nx
+                                else fillA (2# *# lim) (val -# 1#) idx st
+                  in case fillA 2# 8# 1# s2 of
+                      s3 -> case unsafeFreezeByteArray# mba s3 of
+                              (# _, ba #) -> ba
+    in case mkArr realWorld# of
+        b -> BA b
+#endif
diff --git a/src/Math/NumberTheory/Logarithms.hs b/src/Math/NumberTheory/Logarithms.hs
new file mode 100644
--- /dev/null
+++ b/src/Math/NumberTheory/Logarithms.hs
@@ -0,0 +1,74 @@
+{-# LANGUAGE CPP, MagicHash, UnboxedTuples #-}
+
+-- | Integer logarithm, copied from Daniel Fischer's @arithmoi@
+module Math.NumberTheory.Logarithms ( integerLog10' ) where
+
+#if defined(INTEGER_SIMPLE) && __GLASGOW_HASKELL__ < 702
+import GHC.Integer.Logarithms (integerLogBase#)
+import GHC.Base (Int(I#))
+
+-- | Only defined for positive inputs!
+integerLog10' :: Integer -> Int
+integerLog10' m = I# (integerLogBase# 10 m)
+
+#else
+import GHC.Base ( Int(I#), Word#, Int#
+                , int2Word#, eqWord#, neWord#, (-#), and#, uncheckedShiftRL#
+
+#if __GLASGOW_HASKELL__ >= 707
+                , isTrue#
+#endif
+                )
+
+import GHC.Integer.Logarithms.Compat (integerLog2#, wordLog2#)
+
+-- | Only defined for positive inputs!
+integerLog10' :: Integer -> Int
+integerLog10' n
+  | n < 10      = 0
+  | n < 100     = 1
+  | otherwise   = ex + integerLog10' (n `quot` integerPower 10 ex)
+    where
+      ln = I# (integerLog2# n)
+      -- u/v is a good approximation of log 2/log 10
+      u  = 1936274
+      v  = 6432163
+      -- so ex is a good approximation to integerLogBase 10 n
+      ex = fromInteger ((u * fromIntegral ln) `quot` v)
+
+-- | Power of an 'Integer' by the left-to-right repeated squaring algorithm.
+--   This needs two multiplications in each step while the right-to-left
+--   algorithm needs only one multiplication for 0-bits, but here the
+--   two factors always have approximately the same size, which on average
+--   gains a bit when the result is large.
+--
+--   For small results, it is unlikely to be any faster than '(^)', quite
+--   possibly slower (though the difference shouldn't be large), and for
+--   exponents with few bits set, the same holds. But for exponents with
+--   many bits set, the speedup can be significant.
+--
+--   /Warning:/ No check for the negativity of the exponent is performed,
+--   a negative exponent is interpreted as a large positive exponent.
+integerPower :: Integer -> Int -> Integer
+integerPower b (I# e#) = power b (int2Word# e#)
+
+power :: Integer -> Word# -> Integer
+power b w#
+  | isTrue# (w# `eqWord#` 0##) = 1
+  | isTrue# (w# `eqWord#` 1##) = b
+  | otherwise           = go (wordLog2# w# -# 1#) b (b*b)
+    where
+      go 0# l h = if isTrue# ((w# `and#` 1##) `eqWord#` 0##) then l*l else (l*h)
+      go i# l h
+        | w# `hasBit#` i#   = go (i# -# 1#) (l*h) (h*h)
+        | otherwise         = go (i# -# 1#) (l*l) (l*h)
+
+-- | A raw version of testBit for 'Word#'.
+hasBit# :: Word# -> Int# -> Bool
+hasBit# w# i# = isTrue# (((w# `uncheckedShiftRL#` i#) `and#` 1##) `neWord#` 0##)
+
+#if __GLASGOW_HASKELL__ < 707
+isTrue# :: Bool -> Bool
+isTrue# = id
+#endif
+#endif
diff --git a/src/Text/Numeral.hs b/src/Text/Numeral.hs
--- a/src/Text/Numeral.hs
+++ b/src/Text/Numeral.hs
@@ -13,9 +13,13 @@
       -- ** Rendering
       -- $render
 
-      module Text.Numeral.Exp.Reified
+      -- ** Examples
+      -- $examples
+
+      module Text.Numeral.Exp
     , module Text.Numeral.Render
     , module Text.Numeral.Rules
+    , module Text.Numeral.Grammar
     )
     where
 
@@ -23,50 +27,100 @@
 -- Imports
 -------------------------------------------------------------------------------
 
-import "this" Text.Numeral.Exp.Reified
+import "this" Text.Numeral.Exp
 import "this" Text.Numeral.Render
 import "this" Text.Numeral.Rules
+import "this" Text.Numeral.Grammar
 
 -------------------------------------------------------------------------------
 -- Documentation
 -------------------------------------------------------------------------------
 
 {- $overview
-
-The general idea behind this package is to take a number, convert that
-number to an abstract representation of its spoken form and finally
-render that representation to a 'Text' value.
-
+The general idea behind this package is to take a number, convert that number to
+an abstract representation of its spoken form and finally render that
+representation to a 'Text' value.
 -}
 
 {- $dsl
-
 Numerals are represented by a small expression language defined in the
-"Text.Numeral.Exp" module. This language is also reified as the
-concrete type 'Exp' in the "Text.Numeral.Exp.Reified" module.
-
+"Text.Numeral.Exp" module.
 -}
 
 {- $rules
-
-Conversion from numbers to numerals is the responsibility of
-rules. The 'Rule' type itself and a number of useful rules are defined
-in the "Text.Numeral.Rules" module. All rules are completely
-polymorphic in their types. Their result types are only constrained by
-the type classes that make up the numeral expression language.
-
+Conversion from numbers to numerals is the responsibility of rules. The 'Rule'
+type itself and a number of useful rules are defined in the "Text.Numeral.Rules"
+module.
 -}
 
 {- $render
+Finally, the "Text.Numeral.Render" module is responsible for converting the
+numeral expression language to a 'Text' value. This happens via the 'render'
+function. Render is parametrised with a 'Repr' value and with an
+'Inflection'. The 'Repr' contains all the knowledge on how to convert the
+abstract expression to a concrete 'Text' value. The 'Inflection' is used for
+languages where number words change based on a number of grammatical categories
+such as case, gender or number.
+-}
 
-Finally, the "Text.Numeral.Render" module is responsible for
-converting the numeral expression language to a 'Text' value. This
-happens via the 'render' function. Render is parametrised with a
-'Repr' value and with an 'Inflection'. The 'Repr' contains all the
-knowledge on how to convert the abstract expression to a concrete
-'Text' value. The 'Inflection' is used for languages where number
-words change based on a number of grammatical categories such as case,
-gender or number. The expression itself is passed as a concrete 'Exp'
-value.
+{- $examples
+The use of this package is best understood with some examples. First some
+English number names, both British and US variants:
 
+>>> import qualified Text.Numeral.Language.EN as EN
+>>> EN.uk_cardinal defaultInflection 123 :: Maybe Text
+Just "one hundred and twenty-three"
+>>> EN.us_cardinal defaultInflection (10^50 + 42) :: Maybe Text
+Just "one hundred quindecillion forty-two"
+
+French, which contains some traces of a base 20 system:
+
+>>> import qualified Text.Numeral.Language.FR as FR
+>>> FR.cardinal defaultInflection (-99) :: Maybe Text
+Just "moins quatre-vingt-dix-neuf"
+
+Conversions can fail. Alamblak, a language spoken by a few people in Papua New
+Guinea, has no representation for negative numbers:
+
+>>> import qualified Text.Numeral.Language.AMP as AMP
+>>> AMP.cardinal defaultInflection (-3) :: Maybe Text
+Nothing
+
+Some languages have multiple scripts and methods for writing number names. Take
+Chinese for example, which can be written using Han characters or transcribed to
+the Latin script using Pinyin.
+
+Traditional Chinese characters:
+
+>>> import qualified Text.Numeral.Language.ZH as ZH
+>>> ZH.trad_cardinal defaultInflection 123456 :: Maybe Text
+Just "十二萬三千四百五十六"
+
+Simplified characters for use in financial contexts:
+
+>>> ZH.finance_simpl_cardinal defaultInflection 123456 :: Maybe Text
+Just "拾贰万参仟肆伯伍拾陆"
+
+Transcribed using Pinyin:
+
+>>> ZH.pinyin_cardinal defaultInflection 123456 :: Maybe Text
+Just "shíèrwàn sānqiān sìbǎi wǔshí liù"
+
+Using the 'struct' functions you can see the grammatical structure of number
+names. Because the results of these functions are polymorphic you need to
+specify a specific type.
+
+>>> import qualified Text.Numeral.Language.NL as NL
+>>> NL.struct 123 :: Integer
+123
+>>> import Text.Numeral
+>>> NL.struct 123 :: Exp
+Add (Lit 100) (Add (Lit 3) (Mul (Lit 2) (Lit 10)))
+
+Compare with:
+
+>>> NL.cardinal defaultInflection 123 :: Maybe Text
+Just "honderddrieëntwintig"
+
+100 (honderd) + (3 (drie) + (ën) 2 (twin) * 10 (tig))
 -}
diff --git a/src/Text/Numeral/BigNum.hs b/src/Text/Numeral/BigNum.hs
--- a/src/Text/Numeral/BigNum.hs
+++ b/src/Text/Numeral/BigNum.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude
-           , OverloadedStrings
-           , PackageImports
-           , UnicodeSyntax
-  #-}
-
 module Text.Numeral.BigNum
   ( cardinal
   , rule
@@ -24,21 +18,11 @@
 -- Imports
 -------------------------------------------------------------------------------
 
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Functor  ( (<$>) )
-import "base" Data.Maybe    ( Maybe(Nothing, Just) )
-import "base" Prelude       ( Integral, (-) )
-import "base-unicode-symbols"       Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols"       Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols"       Data.List.Unicode     ( (∈) )
-import "base-unicode-symbols"       Data.Monoid.Unicode   ( (⊕) )
-import "base-unicode-symbols"       Prelude.Unicode       ( ℤ )
-import "containers-unicode-symbols" Data.Map.Unicode      ( (∪) )
-import "this"                       Text.Numeral
-import "this"                       Text.Numeral.Misc     ( dec )
-import qualified "containers" Data.Map as M ( Map, fromList, lookup )
-import qualified "this"       Text.Numeral.Exp as E
+import "base" Data.Function ( fix )
+import "base" Data.Monoid ( (<>) )
+import qualified "containers" Data.Map as M
+import "this" Text.Numeral
+import "this" Text.Numeral.Misc ( dec )
 import "text" Data.Text ( Text )
 
 
@@ -46,10 +30,10 @@
 -- Language of Big Numbers
 --------------------------------------------------------------------------------
 
-cardinal ∷ (Integral α) ⇒ inf → α → Maybe Text
-cardinal inf = render cardinalRepr inf ∘ (pos $ fix rule)
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = render cardinalRepr inf . (pos $ fix rule)
 
-rule ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ Rule α β
+rule :: (Integral a) => Rule a
 rule = findRule (   1, lit         )
               [ (  11, add   10 L  )
               , (  20, mul   10 L L)
@@ -62,14 +46,14 @@
               ]
                 (dec 4 - 1)
 
-cardinalRepr ∷ Repr inf
+cardinalRepr :: Repr
 cardinalRepr =
-    defaultRepr { reprValue = \_ n → M.lookup n symMap
-                , reprAdd   = Just $ \_ _ _ → ""
-                , reprMul   = Just $ \_ _ _ → ""
+    defaultRepr { reprValue = \_ n -> M.lookup n symMap
+                , reprAdd   = Just $ \_ _ _ -> ""
+                , reprMul   = Just $ \_ _ _ -> ""
                 }
 
-symMap ∷ (Integral α) ⇒ M.Map α (Ctx (Exp i) → Text)
+symMap :: (Integral a) => M.Map a (Ctx Exp -> Text)
 symMap = M.fromList
          [ (1, forms "m"     "un"       "un"       ""        "")
          , (2, forms "b"     "duo"      "duo"      "vi"      "du")
@@ -80,29 +64,29 @@
          , (7, forms "sept"  "septen"   "septem"   "septua"  "septin")
          , (8, forms "oct"   "octo"     "octo"     "octo"    "octin")
          , (9, forms "non"   "novem"    "novem"    "nona"    "non")
-         , (10, \c → case c of
-                       CtxAdd _ (Lit 100) _              → "deci"
-                       CtxMul _ _ (CtxAdd L (Lit 100) _) → "ginta"
-                       CtxMul {}                         → "gint"
-                       _                                 → "dec"
+         , (10, \c -> case c of
+                       CtxAdd _ (Lit 100) _              -> "deci"
+                       CtxMul _ _ (CtxAdd L (Lit 100) _) -> "ginta"
+                       CtxMul {}                         -> "gint"
+                       _                                 -> "dec"
            )
-         , (100, \c → case c of
+         , (100, \c -> case c of
                         CtxMul _ (Lit n) _
-                            | n ∈ [2,3,6] → "cent"
-                            | otherwise   → "gent"
-                        _                 → "cent"
+                            | n `elem` [2,3,6] -> "cent"
+                            | otherwise        -> "gent"
+                        _                      -> "cent"
            )
          , (1000, const "millin")
          ]
 
-forms ∷ Text → Text → Text → Text → Text → Ctx (Exp i) → Text
+forms :: Text -> Text -> Text -> Text -> Text -> Ctx Exp -> Text
 forms t a1 a2 m1 m2 ctx =
     case ctx of
-      CtxAdd _ (Lit 10)  _ → a1
-      CtxAdd {}            → a2
-      CtxMul _ (Lit 10)  _ → m1
-      CtxMul {}            → m2
-      _                    → t
+      CtxAdd _ (Lit 10)  _ -> a1
+      CtxAdd {}            -> a2
+      CtxMul _ (Lit 10)  _ -> m1
+      CtxMul {}            -> m2
+      _                    -> t
 
 
 --------------------------------------------------------------------------------
@@ -112,42 +96,42 @@
 -- | Function that renders the postfix part of a large number name. Or
 -- more simply put, this calculates the \"illion\" part of
 -- \"million\", \"billion\", etc.
-type PostfixRepr i = i           -- ^ Current inflection.
-                   → Ctx (Exp i) -- ^ Context.
-                   → Text        -- ^ Postfix representation.
+type PostfixRepr = Inflection -- ^ Current inflection.
+                 -> Ctx Exp   -- ^ Context.
+                 -> Text      -- ^ Postfix representation.
 
-scaleRepr ∷ PostfixRepr i
-          → [(ℤ, Ctx (Exp i) → Text)] -- ^ Additional symbol map entries.
-          → ScaleRepr i
-scaleRepr pf syms inf _ _ e ctx = (⊕ pf inf ctx) <$> render repr inf e
+scaleRepr :: PostfixRepr
+          -> [(Integer, Ctx Exp -> Text)] -- ^ Additional symbol map entries.
+          -> ScaleRepr
+scaleRepr pf syms inf _ _ e ctx = (<> pf inf ctx) <$> render repr inf e
     where
-      repr = cardinalRepr { reprValue = \_ n → M.lookup n syms' }
-      syms' = M.fromList syms ∪ symMap
+      repr = cardinalRepr { reprValue = \_ n -> M.lookup n syms' }
+      syms' = M.fromList syms `M.union` symMap
 
-pelletierRepr ∷ PostfixRepr i -- ^Postfix for offset 0 names.
-              → PostfixRepr i -- ^Postfix for offset 3 names.
-              → [(ℤ, Ctx (Exp i) → Text)] -- ^ Additional symbol map entries.
-              → ScaleRepr i
+pelletierRepr :: PostfixRepr -- ^Postfix for offset 0 names.
+              -> PostfixRepr -- ^Postfix for offset 3 names.
+              -> [(Integer, Ctx Exp -> Text)] -- ^ Additional symbol map entries.
+              -> ScaleRepr
 pelletierRepr pf0 pf3 syms inf
-              b o e ctx | o ≡ 0 = scaleRepr pf0 syms inf b o e ctx
-                        | o ≡ 3 = scaleRepr pf3 syms inf b o e ctx
+              b o e ctx | o == 0 = scaleRepr pf0 syms inf b o e ctx
+                        | o == 3 = scaleRepr pf3 syms inf b o e ctx
                         | otherwise = Nothing
 
-quantityName ∷ Text → Text → PostfixRepr i
+quantityName :: Text -> Text -> PostfixRepr
 quantityName s p _ ctx =
     case ctx of
-      CtxMul _ (Lit 1) _ → s
-      CtxMul {}          → p
-      _                  → s
+      CtxMul _ (Lit 1) _ -> s
+      CtxMul {}          -> p
+      _                  -> s
 
-ordQuantityName ∷ Text → Text → Text → Text → PostfixRepr i
+ordQuantityName :: Text -> Text -> Text -> Text -> PostfixRepr
 ordQuantityName sc so pc po _ ctx =
     case ctx of
-      CtxMul _ (Lit 1) _ | outside   → so
-                         | otherwise → sc
-      CtxMul {}          | outside   → po
-                         | otherwise → pc
-      _                  | outside   → so
-                         | otherwise → sc
+      CtxMul _ (Lit 1) _ | outside   -> so
+                         | otherwise -> sc
+      CtxMul {}          | outside   -> po
+                         | otherwise -> pc
+      _                  | outside   -> so
+                         | otherwise -> sc
     where
       outside = isOutside R ctx
diff --git a/src/Text/Numeral/Entry.hs b/src/Text/Numeral/Entry.hs
--- a/src/Text/Numeral/Entry.hs
+++ b/src/Text/Numeral/Entry.hs
@@ -1,7 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 module Text.Numeral.Entry
     ( Conversion(..)
     , Entry(..)
@@ -12,10 +8,8 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Data.Maybe  ( Maybe(Nothing) )
-import "base-unicode-symbols" Prelude.Unicode ( ℤ )
-import "this" Text.Numeral.Exp.Reified ( Exp )
-import "this" Text.Numeral.Grammar.Reified ( Inflection )
+import "this" Text.Numeral.Exp ( Exp )
+import "this" Text.Numeral.Grammar ( Inflection )
 import "text" Data.Text ( Text )
 
 
@@ -23,25 +17,25 @@
 -- Language entry
 --------------------------------------------------------------------------------
 
-data Conversion α = Conversion
-    { toNumeral   ∷ Inflection → α → Maybe Text
-    , toStructure ∷ α → Exp Inflection
+data Conversion a = Conversion
+    { toNumeral   :: Inflection -> a -> Maybe Text
+    , toStructure :: a -> Exp
     }
 
 data Entry = Entry
-    { entIso639_1       ∷ Maybe Text
-    , entIso639_2       ∷ [Text]
-    , entIso639_3       ∷ Maybe Text
-    , entNativeNames    ∷ [Text]
-    , entEnglishName    ∷ Maybe Text
-    , entVariant        ∷ Maybe Text
-    , entCardinal       ∷ Maybe (Conversion ℤ)
-    , entOrdinal        ∷ Maybe (Conversion ℤ)
-    , entPartitive      ∷ Maybe (Conversion (ℤ, ℤ))
-    , entMultiplicative ∷ Maybe (Conversion ℤ)
+    { entIso639_1       :: Maybe Text
+    , entIso639_2       :: [Text]
+    , entIso639_3       :: Maybe Text
+    , entNativeNames    :: [Text]
+    , entEnglishName    :: Maybe Text
+    , entVariant        :: Maybe Text
+    , entCardinal       :: Maybe (Conversion Integer)
+    , entOrdinal        :: Maybe (Conversion Integer)
+    , entPartitive      :: Maybe (Conversion (Integer, Integer))
+    , entMultiplicative :: Maybe (Conversion Integer)
     }
 
-emptyEntry ∷ Entry
+emptyEntry :: Entry
 emptyEntry = Entry
     { entIso639_1       = Nothing
     , entIso639_2       = []
diff --git a/src/Text/Numeral/Exp.hs b/src/Text/Numeral/Exp.hs
--- a/src/Text/Numeral/Exp.hs
+++ b/src/Text/Numeral/Exp.hs
@@ -1,144 +1,124 @@
-{-# LANGUAGE NoImplicitPrelude
-           , PackageImports
-           , TypeFamilies
-           , TypeSynonymInstances
-           , UnicodeSyntax
-  #-}
-
 module Text.Numeral.Exp
-    ( Unknown(unknown, isUnknown)
-    , Lit(lit)
-    , Neg(neg)
-    , Add(add)
-    , Mul(mul)
-    , Sub(sub)
-    , Frac(frac)
-    , Scale(scale)
-    , Dual(dual)
-    , Plural(plural)
-    , Inflection(..)
+    ( Exp(..)
+    , showExp
+    -- , eval
+    , evalScale
+    , Side(L, R)
     ) where
 
 -------------------------------------------------------------------------------
 -- Imports
 -------------------------------------------------------------------------------
 
-import "base" Data.Bool ( Bool(False) )
-import "base" Data.Function ( const )
-import "base" Prelude ( (+), (*), (^), subtract, negate, fromInteger, error )
-import "base-unicode-symbols" Prelude.Unicode ( ℤ, (⋅) )
-
+import qualified "this" Text.Numeral.Grammar as G
 
 -------------------------------------------------------------------------------
--- Expressions
+-- Expression type
 -------------------------------------------------------------------------------
 
--- | An unknown value. This is used to signal that a value can not be
--- represented in the expression language.
---
--- Law: isUnknown unknown == True
-class Unknown α where
-    unknown ∷ α
-    isUnknown ∷ α → Bool
-
--- | A literal value.
---
--- Example in English:
---
--- > "three" = lit 3
-class Lit α where lit ∷ ℤ → α
-
--- | Negation of a value.
---
--- Example in English:
---
--- > "minus two" = neg (lit 2)
-class Neg α where neg ∷ α → α
-
--- | Addition of two values.
---
--- Example in English:
---
--- > "fifteen" = lit 5 `add` lit 10
-class Add α where add ∷ α → α → α
-
--- | Multiplication of two values.
---
--- Example in English:
---
--- > "thirty" = lit 3 `mul` lit 10
-class Mul α where mul ∷ α → α → α
-
--- | One value subtracted from another value.
---
--- Example in Latin:
---
--- > "duodēvīgintī" = lit 2 `sub` (lit 2 `mul` lit 10)
-class Sub α where sub ∷ α → α → α
-
--- | A fraction.
---
--- Example in English:
---
--- > "two thirds" = `frac` (lit 2) (lit 3)
-class Frac α where frac ∷ α → α → α
-
--- | A step in a scale of large values.
---
--- Should be interpreted as @10 ^ (rank * base + offset)@.
---
--- Example in English:
---
--- > "quadrillion" = scale 3 3 4
-class Scale α where
-    scale ∷ ℤ -- ^ Base.
-          → ℤ -- ^ Offset.
-          → α -- ^ Rank.
-          → α
-
--- | A dual of a value.
---
--- This is used in some languages that express some values as the dual
--- of a smaller value. For instance, in Hebrew the number 20 is
--- expressed as the dual of 10.
-class Dual α where dual ∷ α → α
+-- | An expression that represents the structure of a numeral.
+data Exp
+   = Unknown
+     -- ^ An unknown value. This is used to signal that a value can
+     -- not be represented in the expression language.
+   | Lit Integer
+     -- ^ A literal value.
+     --
+     -- Example in English:
+     --
+     -- > "three" = Lit 3
+   | Neg Exp
+     -- ^ Negation of an expression.
+     --
+     -- Example in English:
+     --
+     -- > "minus two" = Neg (Lit 2)
+   | Add Exp Exp
+     -- ^ Addition of two expressions.
+     --
+     -- Example in English:
+     --
+     -- > "fifteen" = Lit 5 `Add` Lit 10
+   | Mul Exp Exp
+     -- ^ Multiplication of two expressions.
+     --
+     -- Example in English:
+     --
+     -- > "thirty" = Lit 3 `Mul` Lit 10
+   | Sub Exp Exp
+     -- ^ One expression subtracted from another expression.
+     --
+     -- Example in Latin:
+     --
+     -- > "duodēvīgintī" = Lit 2 `Sub` (Lit 2 `Mul` Lit 10)
+   | Frac Exp Exp
+     -- ^ A fraction.
+     --
+     -- Example in English:
+     --
+     -- > "two thirds" = `Frac` (Lit 2) (Lit 3)
+   | Scale Integer Integer Exp
+     -- ^ A step in a scale of large values.
+     --
+     -- Should be interpreted as @10 ^ (rank * base + offset)@.
+     --
+     -- Example in English:
+     --
+     -- > "quadrillion" = Scale 3 3 4
+   | ChangeCase   (Maybe G.Case  ) Exp
+   | ChangeGender (Maybe G.Gender) Exp
+     -- ^ A change of grammatical gender.
+     --
+     -- This is used in a language like Spanish where the inflection
+     -- of a number word is not always constant. Specifically, in
+     -- Spanish, large number names always have the masculine
+     -- gender. So 'millón', 'billón' and the like are all
+     -- masculine. This can result in the following number word:
+     -- 10000001 = "un (masculine) millón una (feminine)"
+     --
+     -- Example in Spanish (with the context being Feminine):
+     --
+     -- > "un millón una" = ChangeGender (Just Masculine) (Lit 1) `Mul` Scale 3 3 1 `Add` Lit 1
+   | ChangeNumber (Maybe G.Number) Exp
 
--- | A plural of a value.
---
--- This is used in some languages that express some values as the
--- plural of a smaller value. For instance, in Hebrew the numbers
--- [30,40..90] are expressed as the plurals of [3..9].
-class Plural α where plural ∷ α → α
+infixl 6 `Add`
+infixl 6 `Sub`
+infixl 7 `Mul`
 
--- | A change of inflection.
---
--- This is used in a language like Spanish where the inflection of a
--- number word is not always constant. Specifically, in Spanish, large
--- number names always have the masculine gender. So 'millón',
--- 'billón' and the like are all masculine. This can result in the
--- following number word: 10000001 = "un (masculine) millón una
--- (feminine)"
-class Inflection α where
-    type Inf α
-    inflection ∷ (Inf α → Inf α) → α → α
+showExp :: Exp -> String
+showExp Unknown = "Unknown"
+showExp (Lit n) = "Lit " ++ show n
+showExp (Neg x) = "Neg (" ++ showExp x ++ ")"
+showExp (Add  x y) = "Add ("  ++ showExp x ++ ") (" ++ showExp y ++ ")"
+showExp (Mul  x y) = "Mul ("  ++ showExp x ++ ") (" ++ showExp y ++ ")"
+showExp (Sub  x y) = "Sub ("  ++ showExp x ++ ") (" ++ showExp y ++ ")"
+showExp (Frac x y) = "Frac (" ++ showExp x ++ ") (" ++ showExp y ++ ")"
+showExp (Scale b o r) = "Scale " ++ show b ++ " " ++ show o ++ " (" ++ showExp r ++ ")"
+showExp (ChangeCase   mbC x) = "Case is " ++ show mbC ++ " in (" ++ showExp x ++ ")"
+showExp (ChangeGender mbG x) = "Gender is " ++ show mbG ++ " in (" ++ showExp x ++ ")"
+showExp (ChangeNumber mbN x) = "Number is " ++ show mbN ++ " in (" ++ showExp x ++ ")"
 
-infixl 6 `add`
-infixl 6 `sub`
-infixl 7 `mul`
+evalScale :: (Integral a) => a -> a -> a -> a
+evalScale b o r = 10 ^ (r*b + o)
 
+-- eval :: (Fractional a) => Exp -> Maybe a
+-- eval (Lit x)            = pure x
+-- eval (Add x y)          = (+) <$> eval x <*> eval y
+-- eval (Mul x y)          = (*) <$> eval x <*> eval y
+-- eval (Sub x y)          = subtract <$> eval x <*> eval y
+-- eval (Neg x)            = negate <$> eval x
+-- eval (Frac n d)         = (/) <$> eval n <*> eval d
+-- eval (Scale b o r)      = evalScale (fromInteger b) (fromInteger o) <$> eval r
+-- eval (ChangeCase   _ x) = eval x
+-- eval (ChangeGender _ x) = eval x
+-- eval (ChangeNumber _ x) = eval x
+-- eval Unknown            = Nothing
 
 -------------------------------------------------------------------------------
--- Integer instances
+-- Side
 -------------------------------------------------------------------------------
 
-instance Unknown ℤ where
-    unknown   = error "unknown"
-    isUnknown = const False
-instance Lit ℤ where lit = fromInteger
-instance Neg ℤ where neg = negate
-instance Add ℤ where add = (+)
-instance Mul ℤ where mul = (*)
-instance Sub ℤ where sub = subtract
-instance Scale ℤ where scale b o r = 10 ^ (r⋅b + o)
-
--- TODO: instances for ℚ?
+-- | A side or direction, either 'L'eft or 'R'ight.
+data Side = L -- ^ Left.
+          | R -- ^ Right.
+            deriving (Eq, Show)
diff --git a/src/Text/Numeral/Exp/Reified.hs b/src/Text/Numeral/Exp/Reified.hs
deleted file mode 100644
--- a/src/Text/Numeral/Exp/Reified.hs
+++ /dev/null
@@ -1,111 +0,0 @@
-{-# LANGUAGE CPP
-           , NoImplicitPrelude
-           , PackageImports
-           , TypeFamilies
-           , UnicodeSyntax
-  #-}
-
-module Text.Numeral.Exp.Reified ( Exp(..), showExp, Side(L, R) ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Bool ( Bool(False, True) )
-import "base" Data.Eq   ( Eq )
-import "base" Data.List ( (++) )
-import "base" Prelude   ( String )
-import "base" Text.Show ( Show, show )
-import "base-unicode-symbols" Prelude.Unicode ( ℤ )
-import qualified "this" Text.Numeral.Exp as E
-
-
--------------------------------------------------------------------------------
--- Reified expression type
--------------------------------------------------------------------------------
-
--- | An expression that represents the structure of a numeral.
-data Exp i
-          -- | An unknown value.
-         = Unknown
-          -- | A literal value.
-         | Lit ℤ
-           -- | Negation of an expression.
-         | Neg (Exp i)
-           -- | Addition of two expressions.
-         | Add (Exp i) (Exp i)
-           -- | Multiplication of two expressions.
-         | Mul (Exp i) (Exp i)
-           -- | One expression subtracted from another expression.
-         | Sub (Exp i) (Exp i)
-           -- | A fraction.
-         | Frac (Exp i) (Exp i)
-           -- | A step in a scale of large values.
-         | Scale ℤ ℤ (Exp i)
-           -- | A dual form of an expression.
-         | Dual (Exp i)
-           -- | A plural form of an expression.
-         | Plural (Exp i)
-           -- | A change of inflection.
-         | Inflection (i → i) (Exp i)
-
-infixl 6 `Add`
-infixl 6 `Sub`
-infixl 7 `Mul`
-
-showExp ∷ Exp i → String
-showExp Unknown = "Unknown"
-showExp (Lit n) = "Lit " ++ show n
-showExp (Neg x) = "Neg (" ++ showExp x ++ ")"
-showExp (Add  x y) = "Add ("  ++ showExp x ++ ") (" ++ showExp y ++ ")"
-showExp (Mul  x y) = "Mul ("  ++ showExp x ++ ") (" ++ showExp y ++ ")"
-showExp (Sub  x y) = "Sub ("  ++ showExp x ++ ") (" ++ showExp y ++ ")"
-showExp (Frac x y) = "Frac (" ++ showExp x ++ ") (" ++ showExp y ++ ")"
-showExp (Scale b o r) = "Scale " ++ show b ++ " " ++ show o ++ " (" ++ showExp r ++ ")"
-showExp (Dual   x) = "Dual ("   ++ showExp x ++ ")"
-showExp (Plural x) = "Plural (" ++ showExp x ++ ")"
-showExp (Inflection _ x) = "Inflection <func> (" ++ showExp x ++ ")"
-
-
--- | Precisely the 'Unknown' constructor.
-instance E.Unknown (Exp i) where
-    unknown = Unknown
-    isUnknown Unknown = True
-    isUnknown _       = False
--- | Precisely the 'Lit' constructor.
-instance E.Lit (Exp i) where lit = Lit
--- | Precisely the 'Neg' constructor.
-instance E.Neg (Exp i) where neg = Neg
--- | Precisely the 'Add' constructor.
-instance E.Add (Exp i) where add = Add
--- | Precisely the 'Mul' constructor.
-instance E.Mul (Exp i) where mul = Mul
--- | Precisely the 'Sub' constructor.
-instance E.Sub (Exp i) where sub = Sub
--- | Precisely the 'Frac' constructor.
-instance E.Frac (Exp i) where frac = Frac
--- | Precisely the 'Scale' constructor.
-instance E.Scale (Exp i) where scale = Scale
--- | Precisely the 'Dual' constructor.
-instance E.Dual (Exp i) where dual = Dual
--- | Precisely the 'Plural' constructor.
-instance E.Plural (Exp i) where plural = Plural
--- | Precisely the 'Inflection' constructor.
-instance E.Inflection (Exp i) where
-#if __GLASGOW_HASKELL__ < 704
-    type E.Inf (Exp i) = i
-#else
-    type Inf (Exp i) = i
-#endif
-    inflection = Inflection
-
-
--------------------------------------------------------------------------------
--- Side
--------------------------------------------------------------------------------
-
--- | A side or direction, either 'L'eft or 'R'ight.
-data Side = L -- ^ Left.
-          | R -- ^ Right.
-            deriving (Eq, Show)
diff --git a/src/Text/Numeral/Grammar.hs b/src/Text/Numeral/Grammar.hs
--- a/src/Text/Numeral/Grammar.hs
+++ b/src/Text/Numeral/Grammar.hs
@@ -1,329 +1,471 @@
-{-# LANGUAGE NoImplicitPrelude
-           , UnicodeSyntax
-           , PackageImports
-  #-}
+{-# LANGUAGE NamedFieldPuns #-}
 
 module Text.Numeral.Grammar
     ( -- * Inflection
-      Inflection
+      Inflection(..)
+    , defaultInflection
       -- * Grammatical categories
+    , Case(..)
+    , Gender(..)
+    , Number(..)
+
+      -- * Grammatical categories
       -- ** Case
-    , NoCase               (noCase,               hasNoCase)
-    , Ablative             (ablative,             isAblative)
-    , Abessive             (abessive,             isAbessive)
-    , Accusative           (accusative,           isAccusative)
-    , Comitative           (comitative,           isComitative)
-    , Dative               (dative,               isDative)
-    , Delative             (delative,             isDelative)
-    , Distributive         (distributive,         isDistributive)
-    , DistributiveTemporal (distributiveTemporal, isDistributiveTemporal)
-    , Essive               (essive,               isEssive)
-    , Genitive             (genitive,             isGenitive)
-    , Instrumental         (instrumental,         isInstrumental)
-    , Instructive          (instructive,          isInstructive)
-    , Lative               (lative,               isLative)
-    , Locative             (locative,             isLocative)
-    , Multiplicative       (multiplicative,       isMultiplicative)
-    , Nominative           (nominative,           isNominative)
-    , Partitive            (partitive,            isPartitive)
-    , SuperEssive          (superEssive,          isSuperEssive)
-    , Sublative            (sublative,            isSublative)
-    , Translative          (translative,          isTranslative)
-    , Vocative             (vocative,             isVocative)
+    , noCase,               hasNoCase
+    , ablative,             isAblative
+    , abessive,             isAbessive
+    , accusative,           isAccusative
+    , comitative,           isComitative
+    , dative,               isDative
+    , delative,             isDelative
+    , distributive,         isDistributive
+    , distributiveTemporal, isDistributiveTemporal
+    , essive,               isEssive
+    , genitive,             isGenitive
+    , instrumental,         isInstrumental
+    , instructive,          isInstructive
+    , lative,               isLative
+    , locative,             isLocative
+    , multiplicative,       isMultiplicative
+    , nominative,           isNominative
+    , partitive,            isPartitive
+    , superEssive,          isSuperEssive
+    , sublative,            isSublative
+    , translative,          isTranslative
+    , vocative,             isVocative
       -- *** Locative cases
-    , LocativeInessive (locativeInessive, isLocativeInessive)
-    , LocativeElative  (locativeElative,  isLocativeElative)
-    , LocativeIllative (locativeIllative, isLocativeIllative)
-    , LocativeAdessive (locativeAdessive, isLocativeAdessive)
-    , LocativeAblative (locativeAblative, isLocativeAblative)
-    , LocativeAllative (locativeAllative, isLocativeAllative)
+    , locativeInessive, isLocativeInessive
+    , locativeElative,  isLocativeElative
+    , locativeIllative, isLocativeIllative
+    , locativeAdessive, isLocativeAdessive
+    , locativeAblative, isLocativeAblative
+    , locativeAllative, isLocativeAllative
       -- ** Gender
-    , NoGender  (noGender,  hasNoGender)
-    , Neuter    (neuter,    isNeuter)
-    , Masculine (masculine, isMasculine)
-    , Feminine  (feminine,  isFeminine)
-    , Common    (common,    isCommon)
+    , noGender,  hasNoGender
+    , neuter,    isNeuter
+    , masculine, isMasculine
+    , feminine,  isFeminine
+    , common,    isCommon
       -- ** Number
-    , NoNumber (noNumber, hasNoNumber)
-    , Singular (singular, isSingular)
-    , Dual     (dual,     isDual)
-    , Trial    (trial,    isTrial)
-    , Paucal   (paucal,   isPaucal)
-    , Plural   (plural,   isPlural)
+    , noNumber, hasNoNumber
+    , singular, isSingular
+    , dual,     isDual
+    , trial,    isTrial
+    , paucal,   isPaucal
+    , plural,   isPlural
     ) where
 
+-------------------------------------------------------------------------------
+-- Inflection
+-------------------------------------------------------------------------------
 
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
+data Inflection
+   = Inflection
+     { iCase   :: Maybe Case
+     , iGender :: Maybe Gender
+     , iNumber :: Maybe Number
+     } deriving (Show, Eq)
 
-import "base" Data.Bool ( Bool )
+defaultInflection :: Inflection
+defaultInflection = Inflection Nothing Nothing Nothing
 
 
---------------------------------------------------------------------------------
--- Inflection
---------------------------------------------------------------------------------
+-------------------------------------------------------------------------------
+-- Grammatical categories
+-------------------------------------------------------------------------------
 
--- | Base class for various kinds of inflections.
-class Inflection α
+data Case
+   = Abessive
+     -- ^ In linguistics, abessive (abbreviated abe or abess), caritive and
+     -- privative (abbreviated priv) are names for a grammatical case expressing
+     -- the lack or absence of the marked noun.
+   | Ablative
+     -- ^ The ablative case (abbreviated abl) indicates movement from something,
+     -- or cause.
+   | Accusative
+     -- ^ The accusative case (abbreviated acc) indicates the direct object of a
+     -- verb.
+   | Comitative
+     -- ^ The comitative case (abbreviated com), also known as the associative
+     -- case (abbreviated ass), is a grammatical case that denotes
+     -- companionship, and is used where English would typically use preposition
+     -- "with" in the sense of "in company with" or "together with" (other uses
+     -- of "with," e.g. with the meaning of "using," "by means of" (I cut bread
+     -- with a knife) would correspond to the instrumental case or related
+     -- cases).
+   | Dative
+     -- ^ The dative case (abbreviated dat, or sometimes d when it is a core
+     -- argument) indicates the indirect object of a verb.
+   | Delative
+     -- ^ The delative case (abbreviated del; from Latin deferre "to bear or
+     -- bring away or down") in the Hungarian language can originally express
+     -- the movement from the surface of something (e.g. "off the table"), but
+     -- it is used in several other meanings (e.g. "about people"), some of them
+     -- related to the original (e.g. "from the post office").
+   | Distributive
+     -- ^ The distributive case (abbreviated distr) is used on nouns for the
+     -- meanings of per or each.
+   | DistributiveTemporal
+     -- ^ The distributive-temporal case specifies when something is done.
+   | Essive
+     -- ^ The essive or similaris case (abbreviated ess) carries the meaning of
+     -- a temporary location or state of being, often equivalent to the English
+     -- "as a (child)".
+   | Genitive
+     -- ^ The genitive case (abbreviated gen; also called the possessive case or
+     -- second case), which roughly corresponds to English's possessive case and
+     -- preposition of, indicates the possessor of another noun.
+   | Instrumental
+     -- ^ The instrumental case (abbreviated ins or instr; also called the
+     -- eighth case) indicates an object used in performing an action.
+   | Instructive
+     -- ^ In the Finnish language and Estonian language, the instructive case
+     -- has the basic meaning of "by means of". It is a comparatively rarely
+     -- used case, though it is found in some commonly used expressions, such as
+     -- omin silmin -> "with one's own eyes".
+   | Lative
+     -- ^ Lative (abbreviated lat) is a case which indicates motion to a
+     -- location. It corresponds to the English prepositions "to" and
+     -- "into". The lative case belongs to the group of the general local cases
+     -- together with the locative and separative case. The term derives from
+     -- the Latin lat-, the participle stem of ferre, "to bring".
+   | Locative (Maybe Locative)
+     -- ^ The locative case (abbreviated loc) indicates a location.
+   | Multiplicative
+     -- ^ The multiplicative case is a grammatical case used for marking a
+     -- number of something ("three times").
+   | Nominative
+     -- ^ The nominative case (abbreviated nom) indicates the subject of a
+     -- finite verb.
+   | Partitive
+     -- ^ The partitive case (abbreviated ptv or more ambiguously part) denotes
+     -- "partialness", "without result", or "without specific identity". It is
+     -- also used in contexts where a subgroup is selected from a larger group,
+     -- or with numbers.
+   | Sublative
+     -- ^ The term sublative case (abbreviated subl) is used to refer to
+     -- grammatical cases expressing different situations: In Hungarian, it
+     -- expresses the destination of the movement, originally to the surface of
+     -- something (e.g. sit down on the ground, climb the tree), but in other
+     -- figurative meanings as well (e.g. to university, for two nights), while
+     -- in Tsez and other Northeast Caucasian languages it denotes a movement
+     -- towards the bottomsides or the area under an object. The sublative case
+     -- is used in the Finnish, Tsez and Hungarian languages.
+   | SuperEssive
+     -- ^ The Superessive case (abbreviated supe) is a grammatical declension
+     -- indicating location on top of, or on the surface of something. Its name
+     -- comes from Latin supersum, superesse: to be over and above.
+   | Translative
+     -- ^ The translative case (abbreviated transl) is a grammatical case that
+     -- indicates a change in state of a noun, with the general sense of
+     -- "becoming X" or "change to X".
+   | Vocative
+     -- ^ The vocative case indicates an addressee.
+     deriving (Eq, Show)
 
+data Locative
+   = LocativeIllative
+     -- ^ Illative (abbreviated ill; from Latin illatus "brought in") is, in the
+     -- Finnish language, Estonian language and the Hungarian language, the
+     -- third of the locative cases with the basic meaning of "into (the inside
+     -- of)".
+   | LocativeInessive
+     -- ^ Inessive case (abbreviated ine; from Latin inesse "to be in or at") is
+     -- a locative grammatical case. This case carries the basic meaning of
+     -- "in".
+   | LocativeElative
+     -- ^ Elative (abbreviated ela; from Latin efferre "to bring or carry out")
+     -- is a locative case with the basic meaning "out of".
+   | LocativeAllative
+     -- ^ Allative case (abbreviated all; from Latin allāt-, afferre "to bring
+     -- to") is a type of the locative cases used in several languages. The term
+     -- allative is generally used for the lative case in the majority of
+     -- languages which do not make finer distinctions.
+   | LocativeAdessive
+     -- ^ In Uralic languages, such as Finnish, Estonian and Hungarian, the
+     -- adessive case (abbreviated ade; from Latin adesse "to be present") is
+     -- the fourth of the locative cases with the basic meaning of "on".
+   | LocativeAblative
+     -- ^ In linguistics, ablative case (abbreviated abl) is a name given to
+     -- cases in various languages whose common characteristic is that they mark
+     -- motion away from something, though the details in each language may
+     -- differ. The name "ablative" derives from the Latin ablatus, the
+     -- (irregular) perfect passive participle of auferre "to carry away".
+   deriving (Eq, Show)
 
---------------------------------------------------------------------------------
--- Case
---------------------------------------------------------------------------------
+data Gender
+   = Neuter
+   | Masculine
+   | Feminine
+   | Common
+     deriving (Eq, Show)
 
-class Inflection α ⇒ NoCase α where
-    noCase ∷ α → α
-    hasNoCase ∷ α → Bool
+data Number
+   = Singular
+   | Dual
+   | Trial
+   | Paucal
+   | Plural
+     deriving (Eq, Show)
 
--- | The ablative case (abbreviated abl) indicates movement from
--- something, or cause.
-class Inflection α ⇒ Ablative α where
-    ablative ∷ α → α
-    isAblative ∷ α → Bool
+-------------------------------------------------------------------------------
+-- Smart case constructors
+-------------------------------------------------------------------------------
 
--- | In linguistics, abessive (abbreviated abe or abess), caritive and privative
--- (abbreviated priv) are names for a grammatical case expressing the lack or
--- absence of the marked noun.
-class Inflection α ⇒ Abessive α where
-    abessive ∷ α → α
-    isAbessive ∷ α → Bool
+noCase :: Inflection -> Inflection
+noCase inf = inf { iCase = Nothing }
 
--- | The accusative case (abbreviated acc) indicates the direct object
--- of a verb.
-class Inflection α ⇒ Accusative α where
-    accusative ∷ α → α
-    isAccusative ∷ α → Bool
+hasNoCase :: Inflection -> Bool
+hasNoCase (Inflection {iCase}) = iCase == Nothing
 
--- | The comitative case (abbreviated com), also known as the associative case
--- (abbreviated ass), is a grammatical case that denotes companionship, and is
--- used where English would typically use preposition "with" in the sense of "in
--- company with" or "together with" (other uses of "with," e.g. with the meaning
--- of "using," "by means of" (I cut bread with a knife) would correspond to the
--- instrumental case or related cases).
-class Inflection α ⇒ Comitative α where
-    comitative ∷ α → α
-    isComitative ∷ α → Bool
+ablative :: Inflection -> Inflection
+ablative inf = inf { iCase = Just Ablative }
 
--- | The dative case (abbreviated dat, or sometimes d when it is a
--- core argument) indicates the indirect object of a verb.
-class Inflection α ⇒ Dative α where
-    dative ∷ α → α
-    isDative ∷ α → Bool
+isAblative :: Inflection -> Bool
+isAblative (Inflection {iCase}) = iCase == Just Ablative
 
--- | The delative case (abbreviated del; from Latin deferre "to bear or bring
--- away or down") in the Hungarian language can originally express the movement
--- from the surface of something (e.g. "off the table"), but it is used in
--- several other meanings (e.g. "about people"), some of them related to the
--- original (e.g. "from the post office").
-class Inflection α ⇒ Delative α where
-    delative ∷ α → α
-    isDelative ∷ α → Bool
+abessive :: Inflection -> Inflection
+abessive inf = inf { iCase = Just Abessive }
 
--- | The distributive case (abbreviated distr) is used on nouns for the meanings
--- of per or each.
-class Inflection α ⇒ Distributive α where
-    distributive ∷ α → α
-    isDistributive ∷ α → Bool
+isAbessive :: Inflection -> Bool
+isAbessive (Inflection {iCase}) = iCase == Just Abessive
 
--- | The distributive-temporal case specifies when something is done.
-class Inflection α ⇒ DistributiveTemporal α where
-    distributiveTemporal ∷ α → α
-    isDistributiveTemporal ∷ α → Bool
+accusative :: Inflection -> Inflection
+accusative inf = inf { iCase = Just Accusative }
 
--- | The essive or similaris case (abbreviated ess) carries the meaning of a
--- temporary location or state of being, often equivalent to the English "as a
--- (child)".
-class Inflection α ⇒ Essive α where
-    essive ∷ α → α
-    isEssive ∷ α → Bool
+isAccusative :: Inflection -> Bool
+isAccusative (Inflection {iCase}) = iCase == Just Accusative
 
--- | The genitive case (abbreviated gen; also called the possessive
--- case or second case), which roughly corresponds to English's
--- possessive case and preposition of, indicates the possessor of
--- another noun.
-class Inflection α ⇒ Genitive α where
-    genitive ∷ α → α
-    isGenitive ∷ α → Bool
+comitative :: Inflection -> Inflection
+comitative inf = inf { iCase = Just Comitative }
 
--- | The instrumental case (abbreviated ins or instr; also called the
--- eighth case) indicates an object used in performing an action.
-class Inflection α ⇒ Instrumental α where
-    instrumental ∷ α → α
-    isInstrumental ∷ α → Bool
+isComitative :: Inflection -> Bool
+isComitative (Inflection {iCase}) = iCase == Just Comitative
 
--- | In the Finnish language and Estonian language, the instructive case has the
--- basic meaning of "by means of". It is a comparatively rarely used case,
--- though it is found in some commonly used expressions, such as omin silmin →
--- "with one's own eyes".
-class Inflection α ⇒ Instructive α where
-    instructive ∷ α → α
-    isInstructive ∷ α → Bool
+dative :: Inflection -> Inflection
+dative inf = inf { iCase = Just Dative }
 
--- | Lative (abbreviated lat) is a case which indicates motion to a location. It
--- corresponds to the English prepositions "to" and "into". The lative case
--- belongs to the group of the general local cases together with the locative
--- and separative case. The term derives from the Latin lat-, the participle
--- stem of ferre, "to bring".
-class Inflection α ⇒ Lative α where
-    lative ∷ α → α
-    isLative ∷ α → Bool
+isDative :: Inflection -> Bool
+isDative (Inflection {iCase}) = iCase == Just Dative
 
--- | The locative case (abbreviated loc) indicates a location.
-class Inflection α ⇒ Locative α where
-    locative ∷ α → α
-    isLocative ∷ α → Bool
+delative :: Inflection -> Inflection
+delative inf = inf { iCase = Just Delative }
 
--- | The multiplicative case is a grammatical case used for marking a number of
--- something ("three times").
-class Inflection α ⇒ Multiplicative α where
-    multiplicative ∷ α → α
-    isMultiplicative ∷ α → Bool
+isDelative :: Inflection -> Bool
+isDelative (Inflection {iCase}) = iCase == Just Delative
 
--- | The nominative case (abbreviated nom) indicates the subject of a
--- finite verb.
-class Inflection α ⇒ Nominative α where
-    nominative ∷ α → α
-    isNominative ∷ α → Bool
+distributive :: Inflection -> Inflection
+distributive inf = inf { iCase = Just Distributive }
 
--- | The partitive case (abbreviated ptv or more ambiguously part)
--- denotes "partialness", "without result", or "without specific
--- identity". It is also used in contexts where a subgroup is selected
--- from a larger group, or with numbers.
-class Inflection α ⇒ Partitive α where
-    partitive ∷ α → α
-    isPartitive ∷ α → Bool
+isDistributive :: Inflection -> Bool
+isDistributive (Inflection {iCase}) = iCase == Just Distributive
 
--- | The Superessive case (abbreviated supe) is a grammatical declension
--- indicating location on top of, or on the surface of something. Its name comes
--- from Latin supersum, superesse: to be over and above.
-class Inflection α ⇒ SuperEssive α where
-    superEssive ∷ α → α
-    isSuperEssive ∷ α → Bool
+distributiveTemporal :: Inflection -> Inflection
+distributiveTemporal inf = inf { iCase = Just DistributiveTemporal }
 
--- | The term sublative case (abbreviated subl) is used to refer to grammatical
--- cases expressing different situations: In Hungarian, it expresses the
--- destination of the movement, originally to the surface of something (e.g. sit
--- down on the ground, climb the tree), but in other figurative meanings as well
--- (e.g. to university, for two nights), while in Tsez and other Northeast
--- Caucasian languages it denotes a movement towards the bottomsides or the area
--- under an object. The sublative case is used in the Finnish, Tsez and
--- Hungarian languages.
-class Inflection α ⇒ Sublative α where
-    sublative ∷ α → α
-    isSublative ∷ α → Bool
+isDistributiveTemporal :: Inflection -> Bool
+isDistributiveTemporal (Inflection {iCase}) = iCase == Just DistributiveTemporal
 
--- | The translative case (abbreviated transl) is a grammatical case that
--- indicates a change in state of a noun, with the general sense of "becoming X"
--- or "change to X".
-class Inflection α ⇒ Translative α where
-    translative ∷ α → α
-    isTranslative ∷ α → Bool
+essive :: Inflection -> Inflection
+essive inf = inf { iCase = Just Essive }
 
--- | The vocative case indicates an addressee.
-class Inflection α ⇒ Vocative α where
-    vocative ∷ α → α
-    isVocative ∷ α → Bool
+isEssive :: Inflection -> Bool
+isEssive (Inflection {iCase}) = iCase == Just Essive
 
+genitive :: Inflection -> Inflection
+genitive inf = inf { iCase = Just Genitive }
 
---------------------------------------------------------------------------------
--- Locative cases
---------------------------------------------------------------------------------
+isGenitive :: Inflection -> Bool
+isGenitive (Inflection {iCase}) = iCase == Just Genitive
 
--- | Inessive case (abbreviated ine; from Latin inesse "to be in or at") is a
--- locative grammatical case. This case carries the basic meaning of "in".
-class Locative α ⇒ LocativeInessive α where
-    locativeInessive ∷ α → α
-    isLocativeInessive ∷ α → Bool
+instrumental :: Inflection -> Inflection
+instrumental inf = inf { iCase = Just Instrumental }
 
--- | Elative (abbreviated ela; from Latin efferre "to bring or carry out") is a
--- locative case with the basic meaning "out of".
-class Locative α ⇒ LocativeElative α where
-    locativeElative ∷ α → α
-    isLocativeElative ∷ α → Bool
+isInstrumental :: Inflection -> Bool
+isInstrumental (Inflection {iCase}) = iCase == Just Instrumental
 
--- | Illative (abbreviated ill; from Latin illatus "brought in") is, in the
--- Finnish language, Estonian language and the Hungarian language, the third of
--- the locative cases with the basic meaning of "into (the inside of)".
-class Locative α ⇒ LocativeIllative α where
-    locativeIllative ∷ α → α
-    isLocativeIllative ∷ α → Bool
+instructive :: Inflection -> Inflection
+instructive inf = inf { iCase = Just Instructive }
 
--- | In Uralic languages, such as Finnish, Estonian and Hungarian, the adessive
--- case (abbreviated ade; from Latin adesse "to be present") is the fourth of
--- the locative cases with the basic meaning of "on".
-class Locative α ⇒ LocativeAdessive α where
-    locativeAdessive ∷ α → α
-    isLocativeAdessive ∷ α → Bool
+isInstructive :: Inflection -> Bool
+isInstructive (Inflection {iCase}) = iCase == Just Instructive
 
--- | In linguistics, ablative case (abbreviated abl) is a name given to cases in
--- various languages whose common characteristic is that they mark motion away
--- from something, though the details in each language may differ. The name
--- "ablative" derives from the Latin ablatus, the (irregular) perfect passive
--- participle of auferre "to carry away".
-class Locative α ⇒ LocativeAblative α where
-    locativeAblative ∷ α → α
-    isLocativeAblative ∷ α → Bool
+lative :: Inflection -> Inflection
+lative inf = inf { iCase = Just Lative }
 
--- | Allative case (abbreviated all; from Latin allāt-, afferre "to bring to")
--- is a type of the locative cases used in several languages. The term allative
--- is generally used for the lative case in the majority of languages which do
--- not make finer distinctions.
-class Locative α ⇒ LocativeAllative α where
-    locativeAllative ∷ α → α
-    isLocativeAllative ∷ α → Bool
+isLative :: Inflection -> Bool
+isLative (Inflection {iCase}) = iCase == Just Lative
 
+locative :: Inflection -> Inflection
+locative inf = inf { iCase = Just (Locative Nothing) }
 
---------------------------------------------------------------------------------
--- Gender
---------------------------------------------------------------------------------
+isLocative :: Inflection -> Bool
+isLocative (Inflection {iCase}) =
+        case iCase of
+          Just (Locative _) -> True
+          _                 -> False
 
-class Inflection α ⇒ NoGender α where
-    noGender ∷ α → α
-    hasNoGender ∷ α → Bool
+multiplicative :: Inflection -> Inflection
+multiplicative inf = inf { iCase = Just Multiplicative }
 
-class Inflection α ⇒ Neuter α where
-    neuter ∷ α → α
-    isNeuter ∷ α → Bool
+isMultiplicative :: Inflection -> Bool
+isMultiplicative (Inflection {iCase}) = iCase == Just Multiplicative
 
-class Inflection α ⇒ Masculine α where
-    masculine ∷ α → α
-    isMasculine ∷ α → Bool
+nominative :: Inflection -> Inflection
+nominative inf = inf { iCase = Just Nominative }
 
-class Inflection α ⇒ Feminine α where
-    feminine ∷ α → α
-    isFeminine ∷ α → Bool
+isNominative :: Inflection -> Bool
+isNominative (Inflection {iCase}) = iCase == Just Nominative
 
-class Inflection α ⇒ Common α where
-    common ∷ α → α
-    isCommon ∷ α → Bool
+partitive :: Inflection -> Inflection
+partitive inf = inf { iCase = Just Partitive }
 
+isPartitive :: Inflection -> Bool
+isPartitive (Inflection {iCase}) = iCase == Just Partitive
 
---------------------------------------------------------------------------------
--- Number
---------------------------------------------------------------------------------
+superEssive :: Inflection -> Inflection
+superEssive inf = inf { iCase = Just SuperEssive }
 
-class Inflection α ⇒ NoNumber α where
-    noNumber ∷ α → α
-    hasNoNumber ∷ α → Bool
+isSuperEssive :: Inflection -> Bool
+isSuperEssive (Inflection {iCase}) = iCase == Just SuperEssive
 
-class Inflection α ⇒ Singular α where
-    singular ∷ α → α
-    isSingular ∷ α → Bool
+sublative :: Inflection -> Inflection
+sublative inf = inf { iCase = Just Sublative }
 
-class Inflection α ⇒ Dual α where
-    dual ∷ α → α
-    isDual ∷ α → Bool
+isSublative :: Inflection -> Bool
+isSublative (Inflection {iCase}) = iCase == Just Sublative
 
-class Inflection α ⇒ Trial α where
-    trial ∷ α → α
-    isTrial ∷ α → Bool
+translative :: Inflection -> Inflection
+translative inf = inf { iCase = Just Translative }
 
-class Inflection α ⇒ Paucal α where
-    paucal ∷ α → α
-    isPaucal ∷ α → Bool
+isTranslative :: Inflection -> Bool
+isTranslative (Inflection {iCase}) = iCase == Just Translative
 
-class Inflection α ⇒ Plural α where
-    plural ∷ α → α
-    isPlural ∷ α → Bool
+vocative :: Inflection -> Inflection
+vocative inf = inf { iCase = Just Vocative }
 
+isVocative :: Inflection -> Bool
+isVocative (Inflection {iCase}) = iCase == Just Vocative
+
+
+-------------------------------------------------------------------------------
+-- Smart locative case constructors
+-------------------------------------------------------------------------------
+
+locativeInessive :: Inflection -> Inflection
+locativeInessive inf = inf {iCase = Just $ Locative $ Just LocativeInessive}
+
+isLocativeInessive :: Inflection -> Bool
+isLocativeInessive (Inflection {iCase}) =
+        iCase == (Just $ Locative $ Just LocativeInessive)
+
+locativeElative :: Inflection -> Inflection
+locativeElative inf = inf {iCase = Just $ Locative $ Just LocativeElative}
+
+isLocativeElative :: Inflection -> Bool
+isLocativeElative (Inflection {iCase}) =
+        iCase == (Just $ Locative $ Just LocativeElative)
+
+locativeIllative :: Inflection -> Inflection
+locativeIllative inf = inf {iCase = Just $ Locative $ Just LocativeIllative}
+
+isLocativeIllative :: Inflection -> Bool
+isLocativeIllative (Inflection {iCase}) =
+        iCase == (Just $ Locative $ Just LocativeIllative)
+
+locativeAdessive :: Inflection -> Inflection
+locativeAdessive inf = inf {iCase = Just $ Locative $ Just LocativeAdessive}
+
+isLocativeAdessive :: Inflection -> Bool
+isLocativeAdessive (Inflection {iCase}) =
+        iCase == (Just $ Locative $ Just LocativeAdessive)
+
+locativeAblative :: Inflection -> Inflection
+locativeAblative inf = inf {iCase = Just $ Locative $ Just LocativeAblative}
+
+isLocativeAblative :: Inflection -> Bool
+isLocativeAblative (Inflection {iCase}) =
+        iCase == (Just $ Locative $ Just LocativeAblative)
+
+locativeAllative :: Inflection -> Inflection
+locativeAllative inf = inf {iCase = Just $ Locative $ Just LocativeAllative}
+
+isLocativeAllative :: Inflection -> Bool
+isLocativeAllative (Inflection {iCase}) =
+        iCase == (Just $ Locative $ Just LocativeAllative)
+
+
+-------------------------------------------------------------------------------
+-- Smart gender constructors
+-------------------------------------------------------------------------------
+
+noGender :: Inflection -> Inflection
+noGender inf = inf { iGender = Nothing }
+
+hasNoGender :: Inflection -> Bool
+hasNoGender (Inflection {iGender}) = iGender == Nothing
+
+neuter :: Inflection -> Inflection
+neuter inf = inf { iGender = Just Neuter }
+
+isNeuter :: Inflection -> Bool
+isNeuter (Inflection {iGender}) = iGender == Just Neuter
+
+masculine :: Inflection -> Inflection
+masculine inf = inf { iGender = Just Masculine }
+
+isMasculine :: Inflection -> Bool
+isMasculine (Inflection {iGender}) = iGender == Just Masculine
+
+feminine :: Inflection -> Inflection
+feminine inf = inf { iGender = Just Feminine }
+
+isFeminine :: Inflection -> Bool
+isFeminine (Inflection {iGender}) = iGender == Just Feminine
+
+common :: Inflection -> Inflection
+common inf = inf { iGender = Just Common }
+
+isCommon :: Inflection -> Bool
+isCommon (Inflection {iGender}) = iGender == Just Common
+
+
+-------------------------------------------------------------------------------
+-- Smart number constructors
+-------------------------------------------------------------------------------
+
+noNumber :: Inflection -> Inflection
+noNumber inf = inf { iNumber = Nothing }
+
+hasNoNumber :: Inflection -> Bool
+hasNoNumber (Inflection {iNumber}) = iNumber == Nothing
+
+singular :: Inflection -> Inflection
+singular inf = inf { iNumber = Just Singular }
+
+isSingular :: Inflection -> Bool
+isSingular (Inflection {iNumber}) = iNumber == Just Singular
+
+dual :: Inflection -> Inflection
+dual inf = inf { iNumber = Just Dual }
+
+isDual :: Inflection -> Bool
+isDual (Inflection {iNumber}) = iNumber == Just Dual
+
+trial :: Inflection -> Inflection
+trial inf = inf { iNumber = Just Trial }
+
+isTrial :: Inflection -> Bool
+isTrial (Inflection {iNumber}) = iNumber == Just Trial
+
+paucal :: Inflection -> Inflection
+paucal inf = inf { iNumber = Just Paucal }
+
+isPaucal :: Inflection -> Bool
+isPaucal (Inflection {iNumber}) = iNumber == Just Paucal
+
+plural :: Inflection -> Inflection
+plural inf = inf { iNumber = Just Plural }
+
+isPlural :: Inflection -> Bool
+isPlural (Inflection {iNumber}) = iNumber == Just Plural
diff --git a/src/Text/Numeral/Grammar/Reified.hs b/src/Text/Numeral/Grammar/Reified.hs
deleted file mode 100644
--- a/src/Text/Numeral/Grammar/Reified.hs
+++ /dev/null
@@ -1,277 +0,0 @@
-{-# LANGUAGE NamedFieldPuns
-           , NoImplicitPrelude
-           , UnicodeSyntax
-           , PackageImports
-  #-}
-
-module Text.Numeral.Grammar.Reified
-    ( -- * Inflection
-      Inflection(..)
-    , defaultInflection
-      -- * Grammatical categories
-    , Case(..)
-    , Gender(..)
-    , Number(..)
-    ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( Bool(False, True) )
-import "base" Data.Eq       ( Eq )
-import "base" Data.Function ( ($) )
-import "base" Data.Maybe    ( Maybe(Nothing, Just) )
-import "base" Text.Show     ( Show )
-import "base-unicode-symbols" Data.Eq.Unicode ( (≡) )
-import qualified "this" Text.Numeral.Grammar as G
-
-
--------------------------------------------------------------------------------
--- Inflection
--------------------------------------------------------------------------------
-
-data Inflection = Inflection { iCase   ∷ Maybe Case
-                             , iGender ∷ Maybe Gender
-                             , iNumber ∷ Maybe Number
-                             } deriving (Show, Eq)
-
-instance G.Inflection Inflection
-
-defaultInflection ∷ Inflection
-defaultInflection = Inflection Nothing Nothing Nothing
-
-
--------------------------------------------------------------------------------
--- Grammatical categories
--------------------------------------------------------------------------------
-
-data Case = Abessive
-          | Ablative
-          | Accusative
-          | Comitative
-          | Dative
-          | Delative
-          | Distributive
-          | DistributiveTemporal
-          | Essive
-          | Genitive
-          | Instrumental
-          | Instructive
-          | Lative
-          | Locative (Maybe Locative)
-          | Multiplicative
-          | Nominative
-          | Partitive
-          | Sublative
-          | SuperEssive
-          | Translative
-          | Vocative
-            deriving (Eq, Show)
-
-data Locative = LocativeIllative
-              | LocativeInessive
-              | LocativeElative
-              | LocativeAllative
-              | LocativeAdessive
-              | LocativeAblative
-                deriving (Eq, Show)
-
-data Gender = Neuter
-            | Masculine
-            | Feminine
-            | Common
-              deriving (Eq, Show)
-
-data Number = Singular
-            | Dual
-            | Trial
-            | Paucal
-            | Plural
-              deriving (Eq, Show)
-
-
--------------------------------------------------------------------------------
--- Case instances
--------------------------------------------------------------------------------
-
-instance G.NoCase Inflection where
-    noCase inf = inf { iCase = Nothing }
-    hasNoCase (Inflection {iCase}) = iCase ≡ Nothing
-
-instance G.Ablative Inflection where
-    ablative inf = inf { iCase = Just Ablative }
-    isAblative (Inflection {iCase}) = iCase ≡ Just Ablative
-
-instance G.Abessive Inflection where
-    abessive inf = inf { iCase = Just Abessive }
-    isAbessive (Inflection {iCase}) = iCase ≡ Just Abessive
-
-instance G.Accusative Inflection where
-    accusative inf = inf { iCase = Just Accusative }
-    isAccusative (Inflection {iCase}) = iCase ≡ Just Accusative
-
-instance G.Comitative Inflection where
-    comitative inf = inf { iCase = Just Comitative }
-    isComitative (Inflection {iCase}) = iCase ≡ Just Comitative
-
-instance G.Dative Inflection where
-    dative inf = inf { iCase = Just Dative }
-    isDative (Inflection {iCase}) = iCase ≡ Just Dative
-
-instance G.Delative Inflection where
-    delative inf = inf { iCase = Just Delative }
-    isDelative (Inflection {iCase}) = iCase ≡ Just Delative
-
-instance G.Distributive Inflection where
-    distributive inf = inf { iCase = Just Distributive }
-    isDistributive (Inflection {iCase}) = iCase ≡ Just Distributive
-
-instance G.DistributiveTemporal Inflection where
-    distributiveTemporal inf = inf { iCase = Just DistributiveTemporal }
-    isDistributiveTemporal (Inflection {iCase}) = iCase ≡ Just DistributiveTemporal
-
-instance G.Essive Inflection where
-    essive inf = inf { iCase = Just Essive }
-    isEssive (Inflection {iCase}) = iCase ≡ Just Essive
-
-instance G.Genitive Inflection where
-    genitive inf = inf { iCase = Just Genitive }
-    isGenitive (Inflection {iCase}) = iCase ≡ Just Genitive
-
-instance G.Instrumental Inflection where
-    instrumental inf = inf { iCase = Just Instrumental }
-    isInstrumental (Inflection {iCase}) = iCase ≡ Just Instrumental
-
-instance G.Instructive Inflection where
-    instructive inf = inf { iCase = Just Instructive }
-    isInstructive (Inflection {iCase}) = iCase ≡ Just Instructive
-
-instance G.Lative Inflection where
-    lative inf = inf { iCase = Just Lative }
-    isLative (Inflection {iCase}) = iCase ≡ Just Lative
-
-instance G.Locative Inflection where
-    locative inf = inf { iCase = Just (Locative Nothing) }
-    isLocative (Inflection {iCase}) =
-        case iCase of
-          Just (Locative _) → True
-          _                 → False
-
-instance G.Multiplicative Inflection where
-    multiplicative inf = inf { iCase = Just Multiplicative }
-    isMultiplicative (Inflection {iCase}) = iCase ≡ Just Multiplicative
-
-instance G.Nominative Inflection where
-    nominative inf = inf { iCase = Just Nominative }
-    isNominative (Inflection {iCase}) = iCase ≡ Just Nominative
-
-instance G.Partitive Inflection where
-    partitive inf = inf { iCase = Just Partitive }
-    isPartitive (Inflection {iCase}) = iCase ≡ Just Partitive
-
-instance G.SuperEssive Inflection where
-    superEssive inf = inf { iCase = Just SuperEssive }
-    isSuperEssive (Inflection {iCase}) = iCase ≡ Just SuperEssive
-
-instance G.Sublative Inflection where
-    sublative inf = inf { iCase = Just Sublative }
-    isSublative (Inflection {iCase}) = iCase ≡ Just Sublative
-
-instance G.Translative Inflection where
-    translative inf = inf { iCase = Just Translative }
-    isTranslative (Inflection {iCase}) = iCase ≡ Just Translative
-
-instance G.Vocative Inflection where
-    vocative inf = inf { iCase = Just Vocative }
-    isVocative (Inflection {iCase}) = iCase ≡ Just Vocative
-
-
--------------------------------------------------------------------------------
--- Locative case instances
--------------------------------------------------------------------------------
-
-instance G.LocativeInessive Inflection where
-    locativeInessive inf = inf {iCase = Just $ Locative $ Just LocativeInessive}
-    isLocativeInessive (Inflection {iCase}) =
-        iCase ≡ (Just $ Locative $ Just LocativeInessive)
-
-instance G.LocativeElative Inflection where
-    locativeElative inf = inf {iCase = Just $ Locative $ Just LocativeElative}
-    isLocativeElative (Inflection {iCase}) =
-        iCase ≡ (Just $ Locative $ Just LocativeElative)
-
-instance G.LocativeIllative Inflection where
-    locativeIllative inf = inf {iCase = Just $ Locative $ Just LocativeIllative}
-    isLocativeIllative (Inflection {iCase}) =
-        iCase ≡ (Just $ Locative $ Just LocativeIllative)
-
-instance G.LocativeAdessive Inflection where
-    locativeAdessive inf = inf {iCase = Just $ Locative $ Just LocativeAdessive}
-    isLocativeAdessive (Inflection {iCase}) =
-        iCase ≡ (Just $ Locative $ Just LocativeAdessive)
-
-instance G.LocativeAblative Inflection where
-    locativeAblative inf = inf {iCase = Just $ Locative $ Just LocativeAblative}
-    isLocativeAblative (Inflection {iCase}) =
-        iCase ≡ (Just $ Locative $ Just LocativeAblative)
-
-instance G.LocativeAllative Inflection where
-    locativeAllative inf = inf {iCase = Just $ Locative $ Just LocativeAllative}
-    isLocativeAllative (Inflection {iCase}) =
-        iCase ≡ (Just $ Locative $ Just LocativeAllative)
-
-
--------------------------------------------------------------------------------
--- Gender instances
--------------------------------------------------------------------------------
-
-instance G.NoGender Inflection where
-    noGender inf = inf { iGender = Nothing }
-    hasNoGender (Inflection {iGender}) = iGender ≡ Nothing
-
-instance G.Neuter Inflection where
-    neuter inf = inf { iGender = Just Neuter }
-    isNeuter (Inflection {iGender}) = iGender ≡ Just Neuter
-
-instance G.Masculine Inflection where
-    masculine inf = inf { iGender = Just Masculine }
-    isMasculine (Inflection {iGender}) = iGender ≡ Just Masculine
-
-instance G.Feminine Inflection where
-    feminine inf = inf { iGender = Just Feminine }
-    isFeminine (Inflection {iGender}) = iGender ≡ Just Feminine
-
-instance G.Common Inflection where
-    common inf = inf { iGender = Just Common }
-    isCommon (Inflection {iGender}) = iGender ≡ Just Common
-
-
--------------------------------------------------------------------------------
--- Number instances
--------------------------------------------------------------------------------
-
-instance G.NoNumber Inflection where
-    noNumber inf = inf { iNumber = Nothing }
-    hasNoNumber (Inflection {iNumber}) = iNumber ≡ Nothing
-
-instance G.Singular Inflection where
-    singular inf = inf { iNumber = Just Singular }
-    isSingular (Inflection {iNumber}) = iNumber ≡ Just Singular
-
-instance G.Dual Inflection where
-    dual inf = inf { iNumber = Just Dual }
-    isDual (Inflection {iNumber}) = iNumber ≡ Just Dual
-
-instance G.Trial Inflection where
-    trial inf = inf { iNumber = Just Trial }
-    isTrial (Inflection {iNumber}) = iNumber ≡ Just Trial
-
-instance G.Paucal Inflection where
-    paucal inf = inf { iNumber = Just Paucal }
-    isPaucal (Inflection {iNumber}) = iNumber ≡ Just Paucal
-
-instance G.Plural Inflection where
-    plural inf = inf { iNumber = Just Plural }
-    isPlural (Inflection {iNumber}) = iNumber ≡ Just Plural
diff --git a/src/Text/Numeral/Language/AF.hs b/src/Text/Numeral/Language/AF.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/AF.hs
+++ /dev/null
@@ -1,207 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        af
-
-[@ISO639-2@]        afr
-
-[@ISO639-3@]        afr
-
-[@Native name@]     Afrikaans
-
-[@English name@]    Afrikaans
--}
-
-module Text.Numeral.Language.AF
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-    , ordinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( (<) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum as BN
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- AF
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "af"
-    , entIso639_2    = ["afr"]
-    , entIso639_3    = Just "afr"
-    , entNativeNames = ["Afrikaans"]
-    , entEnglishName = Just "Afrikaans"
-    , entCardinal    = Just Conversion
-                            { toNumeral   = cardinal
-                            , toStructure = struct
-                            }
-    , entOrdinal     = Just Conversion
-                            { toNumeral   = ordinal
-                            , toStructure = struct
-                            }
-    }
-
-cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-ordinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-ordinal inf = ordinalRepr inf ∘ struct
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         )
-       ⇒ α → β
-struct = pos
-       $ fix
-       $ findRule (   0, lit                )
-                [ (  13, add     10      L  )
-                , (  20, mul     10      L L)
-                , ( 100, step1  100   10 R L)
-                , (1000, step1 1000 1000 R L)
-                ]
-                  (dec 6 - 1)
-         `combine` pelletierScale1 R L BN.rule
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-genericRepr ∷ Repr i
-genericRepr = defaultRepr
-               { reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               , reprNeg   = Just $ \_ _   → "min "
-               }
-    where
-      (_     ⊞ Lit 10) _         = ""
-      (Lit n ⊞ _) _ | n < 10     = "-en-"
-                    | otherwise  = ""
-      (_     ⊞ _) _              = " "
-
-      (_ ⊡ Lit _) _ = ""
-      (_ ⊡ _    ) _ = " "
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render genericRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprScale = BN.pelletierRepr (\_ _ → "iljoen")
-                                              (\_ _ → "iljard")
-                                              []
-               }
-    where
-      syms =
-          M.fromList
-          [ (0, const "nul")
-          , (1, const "een")
-          , (2, forms "twee" "twin")
-          , (3, forms "drie" "der")
-          , (4, forms "vier" "veer")
-          , (5, const "vyf")
-          , (6, const "ses")
-          , (7, forms "sewe" "sewen")
-          , (8, \c → case c of
-                       CtxMul _ (Lit 10) _ → "tag"
-                       _                   → "ag"
-            )
-          , (9, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "negen"
-                       CtxMul _ (Lit 10) _ → "neën"
-                       _                   → "nege"
-            )
-          , (10, \c → case c of
-                        CtxMul R _ _ → "tig"
-                        _            → "tien"
-            )
-          , (11, const "elf")
-          , (12, const "twaalf")
-          , (100, const "honderd")
-          , (1000, const "duisend")
-          ]
-
-      forms ∷ s → s → Ctx (Exp i) → s
-      forms n t ctx = case ctx of
-                        CtxMul _ (Lit 10) _ → t
-                        CtxAdd _ (Lit 10) _ → t
-                        CtxAdd _ (Lit _)  _ → n
-                        _                   → n
-
-ordinalRepr ∷ i → Exp i → Maybe Text
-ordinalRepr = render genericRepr
-              { reprValue = \_ n → M.lookup n syms
-              , reprScale = BN.pelletierRepr (\_ _ → "iljoen")
-                                             (\_ _ → "iljard")
-                                             []
-              }
-    where
-      syms =
-          M.fromList
-          [ (0, const "nul")
-          , (1, \c → case c of
-                       CtxEmpty          → "eerste"
-                       _ | isOutside R c → "eende"
-                         | otherwise     → "een"
-            )
-          , (2, forms "tweede" "twee" "twin")
-          , (3, forms "derde"  "drie" "der")
-          , (4, forms "vierde" "vier" "veer")
-          , (5, \c → if isOutside R c then "vyfde" else "vyf")
-          , (6, \c → if isOutside R c then "sesde" else "ses")
-          , (7, forms "sewende" "sewe" "sewen")
-          , (8, \c → case c of
-                       _ | isOutside R c   → "agtste"
-                       CtxMul _ (Lit 10) _ → "tag"
-                       _                   → "ag"
-            )
-          , (9, \c → case c of
-                       _ | isOutside R c   → "negende"
-                       CtxAdd _ (Lit 10) _ → "negen"
-                       CtxMul _ (Lit 10) _ → "neën"
-                       _                   → "nege"
-            )
-          , (10, \c → case c of
-                        CtxMul R _ _ | isOutside R c → "tigste"
-                                     | otherwise     → "tig"
-                        _            | isOutside R c → "tiende"
-                                     | otherwise     → "tien"
-            )
-          , (11, \c → if isOutside R c then "elfde" else "elf")
-          , (12, \c → if isOutside R c then "twaalfde" else "twaalf")
-          , (100, \c → if isOutside R c then "honderste" else "honderd")
-          , (1000, \c → if isOutside R c then "duisendste" else "duisend")
-          ]
-
-      forms ∷ s → s → s → Ctx (Exp i) → s
-      forms o c t ctx = case ctx of
-                          _ | isOutside R ctx → o
-                          CtxMul _ (Lit 10) _ → t
-                          CtxAdd _ (Lit 10) _ → t
-                          CtxAdd _ (Lit _)  _ → c
-                          _                   → c
diff --git a/src/Text/Numeral/Language/AFR.hs b/src/Text/Numeral/Language/AFR.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/AFR.hs
@@ -0,0 +1,191 @@
+{-|
+[@ISO639-1@]        af
+
+[@ISO639-2@]        afr
+
+[@ISO639-3@]        afr
+
+[@Native name@]     Afrikaans
+
+[@English name@]    Afrikaans
+-}
+
+module Text.Numeral.Language.AFR
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+    , ordinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- AF
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "af"
+    , entIso639_2    = ["afr"]
+    , entIso639_3    = Just "afr"
+    , entNativeNames = ["Afrikaans"]
+    , entEnglishName = Just "Afrikaans"
+    , entCardinal    = Just Conversion
+                            { toNumeral   = cardinal
+                            , toStructure = struct
+                            }
+    , entOrdinal     = Just Conversion
+                            { toNumeral   = ordinal
+                            , toStructure = struct
+                            }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+ordinal inf = ordinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = pos
+       $ fix
+       $ findRule (   0, lit                )
+                [ (  13, add     10      L  )
+                , (  20, mul     10      L L)
+                , ( 100, step1  100   10 R L)
+                , (1000, step1 1000 1000 R L)
+                ]
+                  (dec 6 - 1)
+         `combine` pelletierScale1 R L BN.rule
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+genericRepr :: Repr
+genericRepr = defaultRepr
+               { reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               , reprNeg   = Just $ \_ _   -> "min "
+               }
+    where
+      (_     ⊞ Lit 10) _         = ""
+      (Lit n ⊞ _) _ | n < 10     = "-en-"
+                     | otherwise  = ""
+      (_     ⊞ _) _              = " "
+
+      (_ ⊡ Lit _) _ = ""
+      (_ ⊡ _    ) _ = " "
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render genericRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprScale = BN.pelletierRepr (\_ _ -> "iljoen")
+                                              (\_ _ -> "iljard")
+                                              []
+               }
+    where
+      syms =
+          M.fromList
+          [ (0, const "nul")
+          , (1, const "een")
+          , (2, forms "twee" "twin")
+          , (3, forms "drie" "der")
+          , (4, forms "vier" "veer")
+          , (5, const "vyf")
+          , (6, const "ses")
+          , (7, forms "sewe" "sewen")
+          , (8, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "tag"
+                       _                   -> "ag"
+            )
+          , (9, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "negen"
+                       CtxMul _ (Lit 10) _ -> "neën"
+                       _                   -> "nege"
+            )
+          , (10, \c -> case c of
+                        CtxMul R _ _ -> "tig"
+                        _            -> "tien"
+            )
+          , (11, const "elf")
+          , (12, const "twaalf")
+          , (100, const "honderd")
+          , (1000, const "duisend")
+          ]
+
+      forms :: s -> s -> Ctx Exp -> s
+      forms n t ctx = case ctx of
+                        CtxMul _ (Lit 10) _ -> t
+                        CtxAdd _ (Lit 10) _ -> t
+                        CtxAdd _ (Lit _)  _ -> n
+                        _                   -> n
+
+ordinalRepr :: Inflection -> Exp -> Maybe Text
+ordinalRepr = render genericRepr
+              { reprValue = \_ n -> M.lookup n syms
+              , reprScale = BN.pelletierRepr (\_ _ -> "iljoen")
+                                             (\_ _ -> "iljard")
+                                             []
+              }
+    where
+      syms =
+          M.fromList
+          [ (0, const "nul")
+          , (1, \c -> case c of
+                       CtxEmpty          -> "eerste"
+                       _ | isOutside R c -> "eende"
+                         | otherwise     -> "een"
+            )
+          , (2, forms "tweede" "twee" "twin")
+          , (3, forms "derde"  "drie" "der")
+          , (4, forms "vierde" "vier" "veer")
+          , (5, \c -> if isOutside R c then "vyfde" else "vyf")
+          , (6, \c -> if isOutside R c then "sesde" else "ses")
+          , (7, forms "sewende" "sewe" "sewen")
+          , (8, \c -> case c of
+                       _ | isOutside R c   -> "agtste"
+                       CtxMul _ (Lit 10) _ -> "tag"
+                       _                   -> "ag"
+            )
+          , (9, \c -> case c of
+                       _ | isOutside R c   -> "negende"
+                       CtxAdd _ (Lit 10) _ -> "negen"
+                       CtxMul _ (Lit 10) _ -> "neën"
+                       _                   -> "nege"
+            )
+          , (10, \c -> case c of
+                        CtxMul R _ _ | isOutside R c -> "tigste"
+                                     | otherwise     -> "tig"
+                        _            | isOutside R c -> "tiende"
+                                     | otherwise     -> "tien"
+            )
+          , (11, \c -> if isOutside R c then "elfde" else "elf")
+          , (12, \c -> if isOutside R c then "twaalfde" else "twaalf")
+          , (100, \c -> if isOutside R c then "honderste" else "honderd")
+          , (1000, \c -> if isOutside R c then "duisendste" else "duisend")
+          ]
+
+      forms :: s -> s -> s -> Ctx Exp -> s
+      forms o c t ctx = case ctx of
+                          _ | isOutside R ctx -> o
+                          CtxMul _ (Lit 10) _ -> t
+                          CtxAdd _ (Lit 10) _ -> t
+                          CtxAdd _ (Lit _)  _ -> c
+                          _                   -> c
diff --git a/src/Text/Numeral/Language/AMP.hs b/src/Text/Numeral/Language/AMP.hs
--- a/src/Text/Numeral/Language/AMP.hs
+++ b/src/Text/Numeral/Language/AMP.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,14 +26,10 @@
 -- Imports
 -------------------------------------------------------------------------------
 
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
+import "base" Data.Function ( fix )
 import qualified "containers" Data.Map as M ( fromList, lookup )
 import           "this" Text.Numeral
 import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
 import "this" Text.Numeral.Entry
 import "text" Data.Text ( Text )
 
@@ -47,7 +38,7 @@
 -- AMP
 -------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_3    = Just "amp"
     , entEnglishName = Just "Alamblak"
@@ -57,10 +48,10 @@
                             }
     }
 
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
+struct :: (Integral a) => a -> E.Exp
 struct = checkPos
        $ fix
        $ findRule ( 1, lit       )
@@ -74,14 +65,14 @@
                 ]
                   399
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = (1, 399)
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
+               { reprValue = \_ n -> M.lookup n syms
                , reprAdd   = Just (⊞)
-               , reprMul   = Just $ \_ _ _ → " "
+               , reprMul   = Just $ \_ _ _ -> " "
                }
     where
       (Lit 2 ⊞ Lit _) _ = "i"
@@ -91,12 +82,12 @@
           M.fromList
           [ (1,  const "rpat")
           , (2,  const "hosf")
-          , (5,  \c → case c of
-                        CtxMul L _ _ → "tir"
-                        _            → "tir yohtt"
+          , (5,  \c -> case c of
+                        CtxMul L _ _ -> "tir"
+                        _            -> "tir yohtt"
             )
-          , (20, \c → case c of
-                        CtxMul L _ _ → "yima"
-                        _            → "yima yohtt"
+          , (20, \c -> case c of
+                        CtxMul L _ _ -> "yima"
+                        _            -> "yima yohtt"
             )
           ]
diff --git a/src/Text/Numeral/Language/BG.hs b/src/Text/Numeral/Language/BG.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/BG.hs
+++ /dev/null
@@ -1,185 +0,0 @@
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        bg
-
-[@ISO639-2@]        bul
-
-[@ISO639-3@]        bul
-
-[@Native name@]     Български език
-
-[@English name@]    Bulgarian
--}
-
-module Text.Numeral.Language.BG
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤) )
-import "base-unicode-symbols" Prelude.Unicode       ( ℤ )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum  as BN
-import qualified "this" Text.Numeral.Exp     as E
-import qualified "this" Text.Numeral.Grammar as G
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- BG
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "bg"
-    , entIso639_2    = ["bul"]
-    , entIso639_3    = Just "bul"
-    , entNativeNames = ["Български език"]
-    , entEnglishName = Just "Bulgarian"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (G.Neuter i, G.Feminine i, G.Masculine i, Integral α, E.Scale α)
-         ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         , E.Inflection β, G.Masculine (E.Inf β)
-         )
-       ⇒ α → β
-struct = pos $ fix $ rule `combine` shortScale1_bg
-    where
-       rule = findRule (   0, lit               )
-                     [ (  13, add 10 L          )
-                     , (  20, mul 10 R L        )
-                     , ( 100, step  100   10 R L)
-                     , (1000, step 1000 1000 R L)
-                     ]
-                     (dec 6 - 1)
-
--- | Like 'shortScale1' but forces the right-hand-side to have
--- masculine gender.
-shortScale1_bg ∷ ( Integral α, E.Scale α
-                 , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-                 , E.Inflection β, G.Masculine (E.Inf β)
-                 )
-               ⇒ Rule α β
-shortScale1_bg = mulScale_ bgMul 3 3 R L rule
-    where
-      bgMul f m scale' _ = masculineMul (f m) scale'
-      masculineMul x y = E.inflection G.masculine $ E.mul x y
-      rule = findRule (1, lit) [] 14
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 48 - 1 in (negate x, x)
-
-cardinalRepr ∷ (G.Neuter i, G.Feminine i, G.Masculine i) ⇒ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
-               , reprScale = shortScaleRepr
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               , reprNeg   = Just $ \_ _ → "минус "
-               }
-    where
-      (Lit 100 ⊞  Lit _) _          = " и "
-      (_ ⊞ Add _ (Lit 10)) _        = " и "
-      (_ ⊞ Mul _ (Lit 10)) _        = " и "
-      (_ ⊞ Lit 10) _                = ""
-      ((_ `Mul` Lit _) ⊞ Lit _) _   = " и "
-      (Inflection _ _ ⊞ Lit _) _    = " и "
-      (_     ⊞ _     ) _            = " "
-
-      (_ ⊡ Lit n) _ | n ≤ 100 = ""
-      (_ ⊡ _    ) _           = " "
-
-      syms inf =
-          M.fromList
-          [ (0, const "нула")
-          , (1, const $ if G.isFeminine inf
-                        then "една"
-                        else if G.isMasculine inf
-                             then "един"
-                             else "едно"
-            )
-          , (2, \c → case c of
-                       CtxMul _ (Lit   10) _ → "два"
-                       CtxMul _ (Lit  100) _ → "две"
-                       CtxMul _ (Lit 1000) _ → "две"
-                       _ | G.isMasculine inf → "два"
-                         | otherwise         → "две"
-            )
-          , (3, const "три")
-          , (4, const "четири")
-          , (5, const "пет")
-          , (6, const "шест")
-          , (7, const "седем")
-          , (8, const "осем")
-          , (9, const "девет")
-          , (10, \c → case c of
-                        CtxAdd _ (Lit n) _ | n ≤ 9 → "надесет"
-                        _                          → "десет"
-            )
-          , (11, const "единадесет")
-          , (12, const "дванадесет")
-          , (100, \c → case c of
-                         CtxMul _ (Lit 2) _ → "ста"
-                         CtxMul _ (Lit 3) _ → "ста"
-                         CtxMul R _ _       → "стотин"
-                         _                  → "сто"
-            )
-          , (1000, \c → case c of
-                          CtxMul R _ _ → "хиляди"
-                          _            → "хиляда"
-            )
-          ]
-
-shortScaleRepr ∷ i → ℤ → ℤ → (Exp i) → Ctx (Exp i) → Maybe Text
-shortScaleRepr inf b o e
-    = case e of
-        Lit 2 → BN.scaleRepr (BN.quantityName "илиард" "илиарда") syms inf b o e
-        _ → BN.scaleRepr (BN.quantityName "илион" "илиона") syms inf b o e
-    where
-      syms = [ ( 1, const "м")
-             , ( 2, const "м")
-             , ( 3, const "тр")
-             , ( 4, const "квадр")
-             , ( 5, const "квинт")
-             , ( 6, const "секст")
-             , ( 7, const "септ")
-             , ( 8, const "окт")
-             , ( 9, const "нон")
-             , (10, const "дец")
-             , (11, const "индец")
-             , (12, const "дуодец")
-             , (13, const "тридец")
-             , (14, const "куадродец")
-             ]
diff --git a/src/Text/Numeral/Language/BUL.hs b/src/Text/Numeral/Language/BUL.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/BUL.hs
@@ -0,0 +1,163 @@
+{-|
+[@ISO639-1@]        bg
+
+[@ISO639-2@]        bul
+
+[@ISO639-3@]        bul
+
+[@Native name@]     Български език
+
+[@English name@]    Bulgarian
+-}
+
+module Text.Numeral.Language.BUL
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M
+import "this" Text.Numeral
+import "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import qualified "this" Text.Numeral.BigNum  as BN
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- BUL
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "bg"
+    , entIso639_2    = ["bul"]
+    , entIso639_3    = Just "bul"
+    , entNativeNames = ["Български език"]
+    , entEnglishName = Just "Bulgarian"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = pos $ fix $ rule `combine` shortScale1_bg
+    where
+       rule = findRule (   0, lit               )
+                     [ (  13, add 10 L          )
+                     , (  20, mul 10 R L        )
+                     , ( 100, step  100   10 R L)
+                     , (1000, step 1000 1000 R L)
+                     ]
+                     (dec 6 - 1)
+
+-- | Like 'shortScale1' but forces the right-hand-side to have
+-- masculine gender.
+shortScale1_bg :: (Integral a) => Rule a
+shortScale1_bg = mulScale_ bgMul 3 3 R L rule
+    where
+      bgMul f m scale' _ = masculineMul (f m) scale'
+      masculineMul x y = ChangeGender (Just Masculine) $ Mul x y
+      rule = findRule (1, lit) [] 14
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 48 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \inf n -> M.lookup n (syms inf)
+               , reprScale = shortScaleRepr
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               , reprNeg   = Just $ \_ _ -> "минус "
+               }
+    where
+      (Lit 100 ⊞  Lit _)          _ = " и "
+      (_ ⊞ Add _ (Lit 10))        _ = " и "
+      (_ ⊞ Mul _ (Lit 10))        _ = " и "
+      (_ ⊞ Lit 10)                _ = ""
+      ((_ `Mul` Lit _)   ⊞ Lit _) _ = " и "
+      (ChangeGender _ _  ⊞ Lit _) _ = " и "
+      (_                 ⊞ _ )    _ = " "
+
+      (_ ⊡ Lit n) _ | n <= 100 = ""
+      (_ ⊡ _    ) _            = " "
+
+      syms inf =
+          M.fromList
+          [ (0, const "нула")
+          , (1, const $ if isFeminine inf
+                        then "една"
+                        else if isMasculine inf
+                             then "един"
+                             else "едно"
+            )
+          , (2, \c -> case c of
+                       CtxMul _ (Lit   10) _ -> "два"
+                       CtxMul _ (Lit  100) _ -> "две"
+                       CtxMul _ (Lit 1000) _ -> "две"
+                       _ | isMasculine inf   -> "два"
+                         | otherwise         -> "две"
+            )
+          , (3, const "три")
+          , (4, const "четири")
+          , (5, const "пет")
+          , (6, const "шест")
+          , (7, const "седем")
+          , (8, const "осем")
+          , (9, const "девет")
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit n) _
+                            | n <= 9 -> "надесет"
+                        _            -> "десет"
+            )
+          , (11, const "единадесет")
+          , (12, const "дванадесет")
+          , (100, \c -> case c of
+                         CtxMul _ (Lit 2) _ -> "ста"
+                         CtxMul _ (Lit 3) _ -> "ста"
+                         CtxMul R _ _       -> "стотин"
+                         _                  -> "сто"
+            )
+          , (1000, \c -> case c of
+                          CtxMul R _ _ -> "хиляди"
+                          _            -> "хиляда"
+            )
+          ]
+
+shortScaleRepr :: Inflection -> Integer -> Integer -> Exp -> Ctx Exp -> Maybe Text
+shortScaleRepr inf b o e
+    = case e of
+        Lit 2 -> BN.scaleRepr (BN.quantityName "илиард" "илиарда") syms inf b o e
+        _ -> BN.scaleRepr (BN.quantityName "илион" "илиона") syms inf b o e
+    where
+      syms = [ ( 1, const "м")
+             , ( 2, const "м")
+             , ( 3, const "тр")
+             , ( 4, const "квадр")
+             , ( 5, const "квинт")
+             , ( 6, const "секст")
+             , ( 7, const "септ")
+             , ( 8, const "окт")
+             , ( 9, const "нон")
+             , (10, const "дец")
+             , (11, const "индец")
+             , (12, const "дуодец")
+             , (13, const "тридец")
+             , (14, const "куадродец")
+             ]
diff --git a/src/Text/Numeral/Language/CES.hs b/src/Text/Numeral/Language/CES.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/CES.hs
@@ -0,0 +1,140 @@
+{-|
+[@ISO639-1@]        cs
+
+[@ISO639-2B@]       cze
+
+[@ISO639-2T@]       ces
+
+[@ISO639-3@]        ces
+
+[@Native name@]     Čeština
+
+[@English name@]    Czech
+-}
+
+module Text.Numeral.Language.CES
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import qualified "containers" Data.Map as M
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "this" Text.Numeral.Language.POL ( struct )
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- CES
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "cs"
+    , entIso639_2    = ["cze", "ces"]
+    , entIso639_3    = Just "ces"
+    , entNativeNames = ["Čeština"]
+    , entEnglishName = Just "Czech"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprScale = BN.pelletierRepr (quantityRepr "ilión"   "ilióny"  "iliónů")
+                                              (quantityRepr "iliarda" "iliarda" "iliarda")
+                                              []
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               }
+    where
+      (Lit n ⊞ Lit 10) _ | n <= 9 = ""
+      (_     ⊞ _     ) _          = " "
+
+      (_ ⊡ Lit 10 ) _ = ""
+      (_ ⊡ Lit 100) _ = " "
+      (_ ⊡ _      ) _ = " "
+
+      quantityRepr :: Text -> Text -> Text -> BN.PostfixRepr
+      quantityRepr s p1 p2 _ ctx =
+          case ctx of
+            CtxMul _ (Lit 1) _ -> s
+            CtxMul _ (Lit n) _ | n <= 4 -> p1
+            CtxMul {}          -> p2
+            _                  -> s
+
+      syms =
+          M.fromList
+          [ (0,  const                         "nula")
+          , (1,  \c -> case c of
+                        CtxAdd _ (Lit 10)  _ -> "jede"
+                        CtxAdd {}            -> "jedna"
+                        _                    -> "jeden"
+            )
+          , (2,  \c -> case c of
+                        CtxMul _ (Lit 100) _ -> "dvě"
+                        _                    -> "dva"
+            )
+          , (3, const                          "tři")
+          , (4,  \c -> case c of
+                        CtxAdd _ (Lit 10)  _ -> "ctr"
+                        _                    -> "čtyři"
+            )
+          , (5,  \c -> case c of
+                        CtxAdd _ (Lit 10)  _ -> "pat"
+                        CtxMul _ (Lit 10)  _ -> "pa"
+                        _                    -> "pět"
+            )
+          , (6,  \c -> case c of
+                        CtxMul _ (Lit 10)  _ -> "še"
+                        _                    -> "šest"
+            )
+          , (7,  const                         "sedm")
+          , (8,  const                         "osm")
+          , (9,  \c -> case c of
+                        CtxAdd _ (Lit 10)  _ -> "devate"
+                        CtxMul _ (Lit 10)  _ -> "devá"
+                        _                    -> "devět"
+            )
+          , (10,  \c -> case c of
+                         CtxAdd R (Lit n) _
+                             | n <= 9    -> "náct"
+                         CtxMul R (Lit n) _
+                             | n <= 4    -> "cet"
+                             | otherwise -> "desát"
+                         _               -> "deset"
+            )
+          , (100, \c -> case c of
+                         CtxMul _ (Lit n) _
+                             | n == 2 -> "stě"
+                             | n <= 4 -> "sta"
+                             | n <= 9 -> "set"
+                         _            -> "sto"
+            )
+          , (1000, \c -> case c of
+                          CtxMul _ (Lit n) _ | n <= 4 -> "tisíce"
+                          _                           -> "tisíc"
+            )
+          ]
diff --git a/src/Text/Numeral/Language/CHN.hs b/src/Text/Numeral/Language/CHN.hs
--- a/src/Text/Numeral/Language/CHN.hs
+++ b/src/Text/Numeral/Language/CHN.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,14 +26,9 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
+import "base" Data.Function ( fix )
 import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
+import "this" Text.Numeral
 import "this" Text.Numeral.Entry
 import "text" Data.Text ( Text )
 
@@ -47,7 +37,7 @@
 -- CHN
 --------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_2    = ["chn"]
     , entIso639_3    = Just "chn"
@@ -59,10 +49,10 @@
                        }
     }
 
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
+struct :: (Integral a) => a -> Exp
 struct = checkPos
        $ fix
        $ findRule (  0, lit           )
@@ -71,14 +61,14 @@
                 ]
                    100
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = (0, 100)
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just $ \_ _ _ → " pe "
-               , reprMul   = Just $ \_ _ _ → " "
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just $ \_ _ _ -> " pe "
+               , reprMul   = Just $ \_ _ _ -> " "
                }
     where
       syms =
diff --git a/src/Text/Numeral/Language/CHR.hs b/src/Text/Numeral/Language/CHR.hs
--- a/src/Text/Numeral/Language/CHR.hs
+++ b/src/Text/Numeral/Language/CHR.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -33,16 +28,10 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Data.Char     ( Char )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), String )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
+import "base" Data.Function ( fix )
 import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral
+import "this" Text.Numeral.Misc ( dec )
 import "this" Text.Numeral.Entry
 import "text" Data.Text ( Text )
 import qualified "text" Data.Text as T ( concatMap, singleton )
@@ -52,7 +41,7 @@
 -- CHR
 --------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_2    = ["chr"]
     , entIso639_3    = Just "chr"
@@ -64,10 +53,10 @@
                        }
     }
 
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
+struct :: (Integral a) => a -> Exp
 struct = checkPos
        $ fix
        $ findRule (   0, lit                )
@@ -78,12 +67,12 @@
                 ]
                   (dec 6 - 1)
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = (0, dec 6 - 1)
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
+               { reprValue = \_ n -> M.lookup n syms
                , reprAdd   = Just (⊞)
                , reprMul   = Just (⊡)
                }
@@ -100,50 +89,50 @@
       syms =
           M.fromList
           [ (0, const "Ꮭ ᎪᏍᏗ")
-          , (1, \c → case c of
-                       CtxAdd L (Lit 10) _ → "Ꮜ"
-                       CtxAdd R _        _ → "ᏌᏬ"
-                       _                   → "ᏐᏬ"
+          , (1, \c -> case c of
+                       CtxAdd L (Lit 10) _ -> "Ꮜ"
+                       CtxAdd R _        _ -> "ᏌᏬ"
+                       _                   -> "ᏐᏬ"
             )
           , (2, const "ᏔᎵ")
-          , (3, \c → case c of
-                       CtxAdd L (Lit 10)  _ → "ᏦᎦ"
-                       CtxMul _ (Lit 100) CtxEmpty → "Ꮶ"
-                       CtxMul _ (Lit 100) _ → "ᏦᎢ"
-                       _                    → "ᏦᎢ"
+          , (3, \c -> case c of
+                       CtxAdd L (Lit 10)  _ -> "ᏦᎦ"
+                       CtxMul _ (Lit 100) CtxEmpty -> "Ꮶ"
+                       CtxMul _ (Lit 100) _ -> "ᏦᎢ"
+                       _                    -> "ᏦᎢ"
             )
-          , (4, \c → case c of
-                       CtxAdd L (Lit 10) _ → "ᏂᎦ"
-                       _                   → "ᏅᎩ"
+          , (4, \c -> case c of
+                       CtxAdd L (Lit 10) _ -> "ᏂᎦ"
+                       _                   -> "ᏅᎩ"
             )
-          , (5, \c → case c of
-                       CtxAdd L (Lit 10) _ → "ᎯᏍᎦ"
-                       _                   → "ᎯᏍᎩ"
+          , (5, \c -> case c of
+                       CtxAdd L (Lit 10) _ -> "ᎯᏍᎦ"
+                       _                   -> "ᎯᏍᎩ"
             )
-          , (6, \c → case c of
-                       CtxAdd L (Lit 10) _ → "ᏓᎳ"
-                       _                   → "ᏑᏓᎵ"
+          , (6, \c -> case c of
+                       CtxAdd L (Lit 10) _ -> "ᏓᎳ"
+                       _                   -> "ᏑᏓᎵ"
             )
-          , (7, \c → case c of
-                       CtxAdd L (Lit 10)  _ → "ᎦᎵᏆ"
-                       CtxMul _ (Lit 100) CtxEmpty → "ᎦᎵᏆ"
-                       CtxMul _ (Lit 100) _ → "ᎦᎵᏉᎩ"
-                       CtxMul _ _         _ → "ᎦᎵᏆ"
-                       _                    → "ᎦᎵᏉᎩ"
+          , (7, \c -> case c of
+                       CtxAdd L (Lit 10)  _ -> "ᎦᎵᏆ"
+                       CtxMul _ (Lit 100) CtxEmpty -> "ᎦᎵᏆ"
+                       CtxMul _ (Lit 100) _ -> "ᎦᎵᏉᎩ"
+                       CtxMul _ _         _ -> "ᎦᎵᏆ"
+                       _                    -> "ᎦᎵᏉᎩ"
             )
-          , (8, \c → case c of
-                       CtxAdd L (Lit 10)  _ → "ᏁᎳ"
-                       CtxMul _ (Lit 100) CtxEmpty → "ᏧᏁᎵ"
-                       _                    → "ᏧᏁᎳ"
+          , (8, \c -> case c of
+                       CtxAdd L (Lit 10)  _ -> "ᏁᎳ"
+                       CtxMul _ (Lit 100) CtxEmpty -> "ᏧᏁᎵ"
+                       _                    -> "ᏧᏁᎳ"
             )
-          , (9, \c → case c of
-                       CtxMul _ (Lit 100) _ → "ᏐᏁᎵ"
-                       _                    → "ᏐᏁᎳ"
+          , (9, \c -> case c of
+                       CtxMul _ (Lit 100) _ -> "ᏐᏁᎵ"
+                       _                    -> "ᏐᏁᎳ"
             )
-          , (10, \c → case c of
-                        CtxAdd R (Lit _) _           → "Ꮪ"
-                        CtxMul R (Lit _) (CtxAdd {}) → "ᏍᎪ"
-                        _                            → "ᏍᎪᎯ"
+          , (10, \c -> case c of
+                        CtxAdd R (Lit _) _           -> "Ꮪ"
+                        CtxMul R (Lit _) (CtxAdd {}) -> "ᏍᎪ"
+                        _                            -> "ᏍᎪᎯ"
             )
           , (100, const "ᏍᎪᎯᏥᏆ")
           , (1000, const "ᎢᏯᎦᏴᎵ")
@@ -151,10 +140,10 @@
 
 -- | Transliterates a string written in the Cherokee syllabary to the
 -- latin alphabet.
-transliterate ∷ Text → Text
+transliterate :: Text -> Text
 transliterate xs = T.concatMap f xs
     where
-      f ∷ Char → Text
+      f :: Char -> Text
       f 'Ꭰ' = "a"
       f 'Ꭱ' = "e"
       f 'Ꭲ' = "i"
@@ -241,4 +230,3 @@
       f 'Ᏻ' = "yu"
       f 'Ᏼ' = "yv"
       f c   = T.singleton c
-
diff --git a/src/Text/Numeral/Language/CLM.hs b/src/Text/Numeral/Language/CLM.hs
--- a/src/Text/Numeral/Language/CLM.hs
+++ b/src/Text/Numeral/Language/CLM.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,14 +26,9 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
+import "base" Data.Function ( fix )
 import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
+import "this" Text.Numeral
 import "this" Text.Numeral.Entry
 import "text" Data.Text ( Text )
 
@@ -47,7 +37,7 @@
 -- CLM
 --------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_3    = Just "clm"
     , entNativeNames = ["nəxʷsƛ̕ay̕əmúcən"]
@@ -58,10 +48,10 @@
                        }
     }
 
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
+struct :: (Integral a) => a -> Exp
 struct = fix
        $ findRule (   1, lit            )
                 [ (  11, add 10 R       )
@@ -74,13 +64,13 @@
                 ]
                   1000
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = (1, 1000)
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just $ \_ _ _ → " ʔiʔ "
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just $ \_ _ _ -> " ʔiʔ "
                , reprMul   = Just (⊡)
                }
     where
@@ -98,18 +88,18 @@
           , (7, forms "c̕úʔkʷs" "c̕aʔkʷs")
           , (8, forms "táʔcs"  "taʔcs" )
           , (9, forms "tə́kʷxʷ" "təkʷxʷ")
-          , (10, \c → case c of
-                        CtxMul R _ _ → "ɬšáʔ"
-                        _            → "ʔúpən"
+          , (10, \c -> case c of
+                        CtxMul R _ _ -> "ɬšáʔ"
+                        _            -> "ʔúpən"
             )
           , (20, const "nəc̕xʷk̕ʷə́s")
           , (100, const "snáč̕əwəč")
           ]
 
-      forms ∷ s
-            → s
-            → Ctx (Exp i)
-            → s
+      forms :: s
+            -> s
+            -> Ctx Exp
+            -> s
       forms n t ctx = case ctx of
-                        CtxMul _ (Lit 10) _ → t
-                        _                   → n
+                        CtxMul _ (Lit 10) _ -> t
+                        _                   -> n
diff --git a/src/Text/Numeral/Language/CRO.hs b/src/Text/Numeral/Language/CRO.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/CRO.hs
@@ -0,0 +1,144 @@
+{-|
+[@ISO639-1@]        hr
+
+[@ISO639-2B@]       cro
+
+[@ISO639-3@]        cro
+
+[@Native name@]     Hrvatski
+
+[@English name@]    Croatian
+-}
+
+module Text.Numeral.Language.CRO
+    ( -- * Language entries
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , shortScaleStruct
+    , pelletierScaleStruct
+      -- * Bounds
+    , bounds
+    ) where
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- CRO
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "hr"
+    , entIso639_2    = ["cro"]
+    , entIso639_3    = Just "cro"
+    , entNativeNames = ["Hrvatski"]
+    , entEnglishName = Just "Croatian"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+struct :: (Integral a) => a -> Exp
+struct = pos $ fix $ rule
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = render (cardinalRepr "minus " hr_add) inf . shortScaleStruct
+
+shortScaleStruct :: (Integral a) => a -> Exp
+shortScaleStruct = pos $ fix $ rule `combine` shortScale1 R L BN.rule
+
+pelletierScaleStruct :: (Integral a) => a -> Exp
+pelletierScaleStruct = pos $ fix $ rule `combine` pelletierScale1 R L BN.rule
+
+rule :: (Integral a) => Rule a
+rule = findRule (   0, lit       )
+              [ (  11, add 10 L  )
+              , (  20, mul 10 R L)
+              , ( 100, step  100   10 R L)
+              , (1000, step 1000 1000 R L)
+              ] (dec 6 - 1)
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 30003 - 1 in (negate x, x)
+
+genericRepr :: (Exp -> Exp -> Ctx Exp -> Text) -- ^ Add representation.
+            -> Repr
+genericRepr _ =
+    defaultRepr
+    { reprAdd   = Just (hr_add)
+    , reprMul   = Just (⊞)
+    }
+    where
+      (_ ⊞ Lit 10) _  = ""
+      (_ ⊞ Lit 100) _ = ""
+      (_ ⊞ _     ) _  = " "
+
+hr_add :: Exp -> Exp -> Ctx Exp -> Text
+((Lit 100)  `hr_add` _) _       = " "
+((Lit 1000)  `hr_add`_) _       = " "
+((_ `Mul` _     ) `hr_add` _) _ = " "
+(_                `hr_add` _) _ = ""
+
+
+cardinalRepr :: Text -- ^ Negative number prefix.
+             -> (Exp -> Exp -> Ctx Exp -> Text)
+             -> Repr
+cardinalRepr neg f =
+    (genericRepr f)
+    { reprValue = \_ n -> M.lookup n syms
+    , reprScale = BN.scaleRepr (\_ _ -> "ljun") []
+    , reprNeg   = Just $ \_ _ -> neg
+    }
+  where
+    syms =
+        M.fromList
+        [ (0, const "nula")
+        , (1, ten "jedan" "jeda" "jedan")
+        , (2, hun "dva" "dva" "dvje" "dva")
+        , (3, const "tri")
+        , (4, ten "četiri" "četr" "četr")
+        , (5, ten "pet" "pet" "pe")
+        , (6, hun "šest" "šes" "še" "šes")
+        , (7, const "sedam")
+        , (8, const "osam")
+        , (9, ten "devet" "devet" "deve")
+        , (10, \c -> case c of
+                      CtxAdd _ (Lit 100) _ -> "deset"
+                      CtxAdd _ (Lit _) _   -> "naest"
+                      _                    -> "deset"
+          )
+        , (60,  const "šedeset")
+        , (100, const "sto")
+        , (1000, \c -> case c of
+                      CtxMul R _ _ -> "tisuća"
+                      _            -> "tisuću")
+        ]
+
+    ten :: Text -> Text -> Text -> Ctx Exp -> Text
+    ten n a m = \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> a
+                       CtxMul _ (Lit 10) _ -> m
+                       _                   -> n
+
+    hun :: Text -> Text -> Text -> Text -> Ctx Exp -> Text
+    hun n a h m = \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> a
+                       CtxMul _ (Lit 10)  _ -> m
+                       CtxMul _ (Lit 100) _ -> h
+                       _                    -> n
+
+
diff --git a/src/Text/Numeral/Language/CS.hs b/src/Text/Numeral/Language/CS.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/CS.hs
+++ /dev/null
@@ -1,154 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        cs
-
-[@ISO639-2B@]       cze
-
-[@ISO639-2T@]       ces
-
-[@ISO639-3@]        ces
-
-[@Native name@]     Čeština
-
-[@English name@]    Czech
--}
-
-module Text.Numeral.Language.CS
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( const )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum as BN
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "this" Text.Numeral.Language.PL ( struct )
-import "text" Data.Text ( Text )
-
-
--------------------------------------------------------------------------------
--- CS
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "cs"
-    , entIso639_2    = ["cze", "ces"]
-    , entIso639_3    = Just "ces"
-    , entNativeNames = ["Čeština"]
-    , entEnglishName = Just "Czech"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprScale = BN.pelletierRepr (quantityRepr "ilión"   "ilióny"  "iliónů")
-                                              (quantityRepr "iliarda" "iliarda" "iliarda")
-                                              []
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               }
-    where
-      (Lit n ⊞ Lit 10) _ | n ≤ 9 = ""
-      (_     ⊞ _     ) _         = " "
-
-      (_ ⊡ Lit 10 ) _ = ""
-      (_ ⊡ Lit 100) _ = " "
-      (_ ⊡ _      ) _ = " "
-
-      quantityRepr ∷ Text → Text → Text → BN.PostfixRepr i
-      quantityRepr s p1 p2 _ ctx =
-          case ctx of
-            CtxMul _ (Lit 1) _ → s
-            CtxMul _ (Lit n) _ | n ≤ 4 → p1
-            CtxMul {}          → p2
-            _                  → s
-
-      syms =
-          M.fromList
-          [ (0,  const                         "nula")
-          , (1,  \c → case c of
-                        CtxAdd _ (Lit 10)  _ → "jede"
-                        CtxAdd {}            → "jedna"
-                        _                    → "jeden"
-            )
-          , (2,  \c → case c of
-                        CtxMul _ (Lit 100) _ → "dvě"
-                        _                    → "dva"
-            )
-          , (3, const                          "tři")
-          , (4,  \c → case c of
-                        CtxAdd _ (Lit 10)  _ → "ctr"
-                        _                    → "čtyři"
-            )
-          , (5,  \c → case c of
-                        CtxAdd _ (Lit 10)  _ → "pat"
-                        CtxMul _ (Lit 10)  _ → "pa"
-                        _                    → "pět"
-            )
-          , (6,  \c → case c of
-                        CtxMul _ (Lit 10)  _ → "še"
-                        _                    → "šest"
-            )
-          , (7,  const                         "sedm")
-          , (8,  const                         "osm")
-          , (9,  \c → case c of
-                        CtxAdd _ (Lit 10)  _ → "devate"
-                        CtxMul _ (Lit 10)  _ → "devá"
-                        _                    → "devět"
-            )
-          , (10,  \c → case c of
-                         CtxAdd R (Lit n) _
-                             | n ≤ 9     → "náct"
-                         CtxMul R (Lit n) _
-                             | n ≤ 4     → "cet"
-                             | otherwise → "desát"
-                         _               → "deset"
-            )
-          , (100, \c → case c of
-                         CtxMul _ (Lit n) _
-                             | n ≡ 2 → "stě"
-                             | n ≤ 4 → "sta"
-                             | n ≤ 9 → "set"
-                         _           → "sto"
-            )
-          , (1000, \c → case c of
-                          CtxMul _ (Lit n) _ | n ≤ 4 → "tisíce"
-                          _                          → "tisíc"
-            )
-          ]
diff --git a/src/Text/Numeral/Language/DE.hs b/src/Text/Numeral/Language/DE.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/DE.hs
+++ /dev/null
@@ -1,241 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        de
-
-[@ISO639-2B@]       ger
-
-[@ISO639-2T@]       deu
-
-[@ISO639-3@]        deu
-
-[@Native name@]     Deutsch
-
-[@English name@]    German
--}
-
-module Text.Numeral.Language.DE
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-    , ordinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.List.Unicode     ( (∈) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤), (≥) )
-import "base-unicode-symbols" Prelude.Unicode       ( ℤ )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum as BN
-import qualified "this" Text.Numeral.Exp    as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
--------------------------------------------------------------------------------
--- DE
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "de"
-    , entIso639_2    = ["ger", "deu"]
-    , entIso639_3    = Just "deu"
-    , entNativeNames = ["Deutsch"]
-    , entEnglishName = Just "German"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    , entOrdinal     = Just Conversion
-                       { toNumeral   = ordinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-ordinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-ordinal inf = ordinalRepr inf ∘ struct
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         )
-       ⇒ α → β
-struct = pos
-       $ fix
-       $ findRule (   0, lit       )
-               [ (  13, add 10 L  )
-               , (  20, mul 10 L L)
-               , ( 100, step 100    10 R L)
-               , (1000, step 1000 1000 R L)
-               ]
-                 (dec 6 - 1)
-         `combine` pelletierScale R L BN.rule
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-genericRepr ∷ Repr i
-genericRepr = defaultRepr
-              { reprAdd   = Just (⊞)
-              , reprMul   = Just (⊡)
-              , reprNeg   = Just $ \_ _   → "minus "
-              }
-    where
-      (Lit n ⊞ (_ `Mul` Lit 10)) _ | n ≤ 9 = "und"
-      (_ ⊞ _ ) _ = ""
-
-      (_ ⊡ Scale _ _ _) _ = " "
-      (_ ⊡ _)           _ = ""
-
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render genericRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprScale = BN.pelletierRepr (BN.quantityName "illion"   "illionen")
-                                              (BN.quantityName "illiarde" "illiarden")
-                                              bigNumSyms
-               }
-    where
-      syms =
-          M.fromList
-          [ (0, const "null")
-          , (1, \c → case c of
-                       CtxAdd R _ _     → "eins"
-                       CtxAdd L _ _     → "ein"
-                       CtxMul _ (Lit n) _
-                           | n ≥ dec 6  → "eine"
-                           | n ≥ 100    → "ein"
-                       _                → "eins"
-            )
-          , (2, \c → case c of
-                       CtxMul _ (Lit 10) _ → "zwan"
-                       _                   → "zwei"
-            )
-          , (3, const "drei")
-          , (4, const "vier")
-          , (5, const "fünf")
-          , (6, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "sech"
-                       CtxMul _ (Lit 10) _ → "sech"
-                       _                   → "sechs"
-            )
-          , (7, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "sieb"
-                       CtxMul _ (Lit 10) _ → "sieb"
-                       _                   → "sieben"
-            )
-          , (8, const "acht")
-          , (9, const "neun")
-          , (10, \c → case c of
-                        CtxMul _ (Lit 3) _ → "ßig"
-                        CtxMul R (Lit _) _ → "zig"
-                        _                  → "zehn"
-            )
-          , (11, const "elf")
-          , (12, const "zwölf")
-          , (100, const "hundert")
-          , (1000, const "tausend")
-          ]
-
-ordinalRepr ∷ i → Exp i → Maybe Text
-ordinalRepr = render genericRepr
-              { reprValue = \_ n → M.lookup n syms
-              , reprScale = BN.pelletierRepr (BN.ordQuantityName "illion" "illionste"
-                                                                 "illion" "illionste"
-                                             )
-                                             (BN.ordQuantityName "illiarde" "illiardste"
-                                                                 "illiarde" "illiardste"
-                                             )
-                                             bigNumSyms
-              }
-    where
-      syms =
-          M.fromList
-          [ (0, \c → case c of
-                       CtxEmpty → "nullte"
-                       _        → "null"
-            )
-          , (1, \c → case c of
-                       _ | isOutside R c → "erste"
-                       CtxAdd {}         → "ein"
-                       CtxMul _ (Lit n) _
-                           | n ≥ dec 6   → "eine"
-                           | n ≥ 100     → "ein"
-                       _                 → "eins"
-            )
-          , (2, \c → case c of
-                       _ | isOutside R c   → "zweite"
-                       CtxMul _ (Lit 10) _ → "zwan"
-                       _                   → "zwei"
-            )
-          , (3, \c → if isOutside R c then "dritte" else "drei")
-          , (4, \c → if isOutside R c then "vierte" else "vier")
-          , (5, \c → if isOutside R c then "fünfte" else "fünf")
-          , (6, \c → case c of
-                       _ | isOutside R c   → "sechste"
-                       CtxAdd _ (Lit 10) _ → "sech"
-                       CtxMul _ (Lit 10) _ → "sech"
-                       _                   → "sechs"
-            )
-          , (7, \c → case c of
-                       _ | isOutside R c   → "siebte"
-                       CtxAdd _ (Lit 10) _ → "sieb"
-                       CtxMul _ (Lit 10) _ → "sieb"
-                       _                   → "sieben"
-            )
-          , (8, \c → if isOutside R c then "achte"  else "acht")
-          , (9, \c → if isOutside R c then "neunte" else "neun")
-          , (10, \c → case c of
-                        CtxMul _ (Lit 3) _ | isOutside R c → "ßigste"
-                                           | otherwise     → "ßig"
-                        CtxMul R (Lit _) _ | isOutside R c → "zigste"
-                                           | otherwise     → "zig"
-                        _                  | isOutside R c → "zehnte"
-                                           | otherwise     → "zehn"
-            )
-          , (11, \c → if isOutside R c then "elfte"   else "elf")
-          , (12, \c → if isOutside R c then "zwölfte" else "zwölf")
-          , (100, \c → if isOutside R c then "hundertste" else "hundert")
-          , (1000, \c → if isOutside R c then "tausendste" else "tausend")
-          ]
-
-bigNumSyms ∷ [(ℤ, Ctx (Exp i) → Text)]
-bigNumSyms =
-    [ (8, BN.forms "okt" "okto" "okto" "okto" "oktin")
-    , (10, \c → case c of
-                  CtxAdd _ (Lit 100) _              → "dezi"
-                  CtxMul _ _ (CtxAdd _ (Lit 100) _) → "ginta"
-                  CtxMul {}                         → "gint"
-                  _                                 → "dez"
-      )
-    , (100, \c → case c of
-                   CtxMul _ (Lit n) _
-                       | n ∈ [2,3,6] → "zent"
-                       | otherwise   → "gent"
-                   _                 → "zent"
-      )
-    ]
diff --git a/src/Text/Numeral/Language/DEU.hs b/src/Text/Numeral/Language/DEU.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/DEU.hs
@@ -0,0 +1,223 @@
+{-|
+[@ISO639-1@]        de
+
+[@ISO639-2B@]       ger
+
+[@ISO639-2T@]       deu
+
+[@ISO639-3@]        deu
+
+[@Native name@]     Deutsch
+
+[@English name@]    German
+-}
+
+module Text.Numeral.Language.DEU
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+    , ordinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- DEU
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "de"
+    , entIso639_2    = ["ger", "deu"]
+    , entIso639_3    = Just "deu"
+    , entNativeNames = ["Deutsch"]
+    , entEnglishName = Just "German"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    , entOrdinal     = Just Conversion
+                       { toNumeral   = ordinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+ordinal inf = ordinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = pos
+       $ fix
+       $ findRule (   0, lit       )
+                [ (  13, add 10 L  )
+                , (  20, mul 10 L L)
+                , ( 100, step 100    10 R L)
+                , (1000, step 1000 1000 R L)
+                ]
+                  (dec 6 - 1)
+         `combine` pelletierScale R L BN.rule
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+genericRepr :: Repr
+genericRepr = defaultRepr
+              { reprAdd   = Just (⊞)
+              , reprMul   = Just (⊡)
+              , reprNeg   = Just $ \_ _   -> "minus "
+              }
+    where
+      (Lit n ⊞ (_ `Mul` Lit 10)) _ | n <= 9 = "und"
+      (_ ⊞ _ ) _ = ""
+
+      (_ ⊡ Scale _ _ _) _ = " "
+      (_ ⊡ _)           _ = ""
+
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render genericRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprScale = BN.pelletierRepr (BN.quantityName "illion"   "illionen")
+                                              (BN.quantityName "illiarde" "illiarden")
+                                              bigNumSyms
+               }
+    where
+      syms =
+          M.fromList
+          [ (0, const "null")
+          , (1, \c -> case c of
+                       CtxAdd R _ _     -> "eins"
+                       CtxAdd L _ _     -> "ein"
+                       CtxMul _ (Lit n) _
+                           | n >= dec 6 -> "eine"
+                           | n >= 100   -> "ein"
+                       _                -> "eins"
+            )
+          , (2, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "zwan"
+                       _                   -> "zwei"
+            )
+          , (3, const "drei")
+          , (4, const "vier")
+          , (5, const "fünf")
+          , (6, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "sech"
+                       CtxMul _ (Lit 10) _ -> "sech"
+                       _                   -> "sechs"
+            )
+          , (7, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "sieb"
+                       CtxMul _ (Lit 10) _ -> "sieb"
+                       _                   -> "sieben"
+            )
+          , (8, const "acht")
+          , (9, const "neun")
+          , (10, \c -> case c of
+                        CtxMul _ (Lit 3) _ -> "ßig"
+                        CtxMul R (Lit _) _ -> "zig"
+                        _                  -> "zehn"
+            )
+          , (11, const "elf")
+          , (12, const "zwölf")
+          , (100, const "hundert")
+          , (1000, const "tausend")
+          ]
+
+ordinalRepr :: Inflection -> Exp -> Maybe Text
+ordinalRepr = render genericRepr
+              { reprValue = \_ n -> M.lookup n syms
+              , reprScale = BN.pelletierRepr (BN.ordQuantityName "illion" "illionste"
+                                                                 "illion" "illionste"
+                                             )
+                                             (BN.ordQuantityName "illiarde" "illiardste"
+                                                                 "illiarde" "illiardste"
+                                             )
+                                             bigNumSyms
+              }
+    where
+      syms =
+          M.fromList
+          [ (0, \c -> case c of
+                       CtxEmpty -> "nullte"
+                       _        -> "null"
+            )
+          , (1, \c -> case c of
+                       _ | isOutside R c -> "erste"
+                       CtxAdd {}         -> "ein"
+                       CtxMul _ (Lit n) _
+                           | n >= dec 6  -> "eine"
+                           | n >= 100    -> "ein"
+                       _                 -> "eins"
+            )
+          , (2, \c -> case c of
+                       _ | isOutside R c   -> "zweite"
+                       CtxMul _ (Lit 10) _ -> "zwan"
+                       _                   -> "zwei"
+            )
+          , (3, \c -> if isOutside R c then "dritte" else "drei")
+          , (4, \c -> if isOutside R c then "vierte" else "vier")
+          , (5, \c -> if isOutside R c then "fünfte" else "fünf")
+          , (6, \c -> case c of
+                       _ | isOutside R c   -> "sechste"
+                       CtxAdd _ (Lit 10) _ -> "sech"
+                       CtxMul _ (Lit 10) _ -> "sech"
+                       _                   -> "sechs"
+            )
+          , (7, \c -> case c of
+                       _ | isOutside R c   -> "siebte"
+                       CtxAdd _ (Lit 10) _ -> "sieb"
+                       CtxMul _ (Lit 10) _ -> "sieb"
+                       _                   -> "sieben"
+            )
+          , (8, \c -> if isOutside R c then "achte"  else "acht")
+          , (9, \c -> if isOutside R c then "neunte" else "neun")
+          , (10, \c -> case c of
+                        CtxMul _ (Lit 3) _ | isOutside R c -> "ßigste"
+                                           | otherwise     -> "ßig"
+                        CtxMul R (Lit _) _ | isOutside R c -> "zigste"
+                                           | otherwise     -> "zig"
+                        _                  | isOutside R c -> "zehnte"
+                                           | otherwise     -> "zehn"
+            )
+          , (11, \c -> if isOutside R c then "elfte"   else "elf")
+          , (12, \c -> if isOutside R c then "zwölfte" else "zwölf")
+          , (100, \c -> if isOutside R c then "hundertste" else "hundert")
+          , (1000, \c -> if isOutside R c then "tausendste" else "tausend")
+          ]
+
+bigNumSyms :: [(Integer, Ctx Exp -> Text)]
+bigNumSyms =
+    [ (8, BN.forms "okt" "okto" "okto" "okto" "oktin")
+    , (10, \c -> case c of
+                  CtxAdd _ (Lit 100) _              -> "dezi"
+                  CtxMul _ _ (CtxAdd _ (Lit 100) _) -> "ginta"
+                  CtxMul {}                         -> "gint"
+                  _                                 -> "dez"
+      )
+    , (100, \c -> case c of
+                   CtxMul _ (Lit n) _
+                       | n `elem` [2,3,6] -> "zent"
+                       | otherwise        -> "gent"
+                   _                      -> "zent"
+      )
+    ]
diff --git a/src/Text/Numeral/Language/EN.hs b/src/Text/Numeral/Language/EN.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/EN.hs
+++ /dev/null
@@ -1,266 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        en
-
-[@ISO639-2B@]       eng
-
-[@ISO639-3@]        eng
-
-[@Native name@]     English
-
-[@English name@]    English
--}
-
-module Text.Numeral.Language.EN
-    ( -- * Language entries
-      gb_entry
-    , us_entry
-      -- * Conversions
-    , gb_cardinal
-    , gb_ordinal
-    , gbPelletier_cardinal
-    , us_cardinal
-    , us_ordinal
-      -- * Structure
-    , shortScaleStruct
-    , pelletierScaleStruct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( (<) )
-import "base" Prelude       ( (+), (-), div, subtract, negate, (^), error, Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Prelude.Unicode ( ℤ, (⋅) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum as BN
-import qualified "this" Text.Numeral.Exp    as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- EN
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "en"
-    , entIso639_2    = ["eng"]
-    , entIso639_3    = Just "eng"
-    , entNativeNames = ["English"]
-    , entEnglishName = Just "English"
-    }
-
-gb_entry ∷ Entry
-gb_entry = entry
-    { entVariant  = Just "en-GB"
-    , entCardinal = Just Conversion
-                    { toNumeral   = gb_cardinal
-                    , toStructure = shortScaleStruct
-                    }
-    , entOrdinal  = Just Conversion
-                    { toNumeral   = gb_ordinal
-                    , toStructure = shortScaleStruct
-                    }
-    }
-
-us_entry ∷ Entry
-us_entry = entry
-    { entVariant  = Just "en-US"
-    , entCardinal = Just Conversion
-                    { toNumeral   = us_cardinal
-                    , toStructure = shortScaleStruct
-                    }
-    , entOrdinal  = Just Conversion
-                    { toNumeral   = us_ordinal
-                    , toStructure = shortScaleStruct
-                    }
-    }
-
-gb_cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-gb_cardinal inf = render (cardinalRepr "minus " gb_add) inf ∘ shortScaleStruct
-
-gb_ordinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-gb_ordinal inf = render (ordinalRepr gb_add) inf ∘ shortScaleStruct
-
-gbPelletier_cardinal ∷ (Inflection i, Integral α, E.Scale α)
-                     ⇒ i → α → Maybe Text
-gbPelletier_cardinal inf = render (cardinalRepr "minus " gb_add) { reprScale = pelletierRepr } inf
-                         ∘ pelletierScaleStruct
-  where
-    pelletierRepr = BN.pelletierRepr (\_ _ → "illion")
-                                     (\_ _ → "illiard")
-                                     []
-
-us_cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-us_cardinal inf = render (cardinalRepr "negative " us_add) inf ∘ shortScaleStruct
-
-us_ordinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-us_ordinal inf = render (ordinalRepr us_add) inf ∘ shortScaleStruct
-
-shortScaleStruct ∷ ( Integral α, E.Scale α
-                   , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-                   )
-                 ⇒ α → β
-shortScaleStruct = pos $ fix $ rule `combine` shortScale1 R L BN.rule
-
-pelletierScaleStruct ∷ ( Integral α, E.Scale α
-                       , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-                       )
-                     ⇒ α → β
-pelletierScaleStruct = pos $ fix $ rule `combine` pelletierScale1 R L BN.rule
-
-rule ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ Rule α β
-rule = findRule (   0, lit       )
-              [ (  13, add 10 L  )
-              , (  20, mul 10 R L)
-              , ( 100, step1  100   10 R L)
-              , (1000, step1 1000 1000 R L)
-              ]
-                (dec 6 - 1)
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 30003 - 1 in (negate x, x)
-
-genericRepr ∷ (Exp i → Exp i → Ctx (Exp i) → Text) -- ^ Add representation.
-            → Repr i
-genericRepr f =
-    defaultRepr
-    { reprAdd   = Just f
-    , reprMul   = Just (⊞)
-    }
-    where
-      (_ ⊞ Lit 10) _ = ""
-      (_ ⊞ _     ) _ = " "
-
-eval ∷ Exp i → ℤ
-eval (Lit x)       = x
-eval (Add x y)     = eval x + eval y
-eval (Mul x y)     = eval x ⋅ eval y
-eval (Sub x y)     = subtract (eval x) (eval y)
-eval (Neg x)       = negate (eval x)
-eval (Frac n d)    = eval n `div` eval d
-eval (Scale b o r) = 10 ^ (eval r ⋅ b + o)
-eval (Dual x)      = eval x
-eval (Plural x)    = eval x
-eval (Inflection _ x) = eval x
-eval Unknown       = error "eval: unknown"
-
-
-gb_add ∷ Exp i → Exp i → Ctx (Exp i) → Text
-((_ `Mul` Lit 10) `gb_add` _) _ = "-"
-((_ `Mul` _     ) `gb_add` x) _
-    | eval x < (100 ∷ ℤ)        = " and "
-    | otherwise                 = " "
-(_                `gb_add` _) _ = ""
-
-us_add ∷ Exp i → Exp i → Ctx (Exp i) → Text
-((_ `Mul` Lit 10) `us_add` _) _ = "-"
-((_ `Mul` _     ) `us_add` _) _ = " "
-(_                `us_add` _) _ = ""
-
-cardinalRepr ∷ Text -- ^ Negative number prefix.
-             → (Exp i → Exp i → Ctx (Exp i) → Text)
-             → Repr i
-cardinalRepr neg f =
-    (genericRepr f)
-    { reprValue = \_ n → M.lookup n syms
-    , reprScale = BN.scaleRepr (\_ _ → "illion") []
-    , reprNeg   = Just $ \_ _ → neg
-    }
-  where
-    syms =
-        M.fromList
-        [ (0, const "zero")
-        , (1, const "one")
-        , (2, ten   "two"   "two"  "twen")
-        , (3, ten   "three" "thir" "thir")
-        , (4, ten   "four"  "four" "for")
-        , (5, ten   "five"  "fif"  "fif")
-        , (6, const "six")
-        , (7, const "seven")
-        , (8, ten   "eight" "eigh" "eigh")
-        , (9, const "nine")
-        , (10, \c → case c of
-                      CtxAdd _ (Lit _) _ → "teen"
-                      CtxMul R _       _ → "ty"
-                      _                  → "ten"
-          )
-        , (11,   const "eleven")
-        , (12,   const "twelve")
-        , (100,  const "hundred")
-        , (1000, const "thousand")
-        ]
-
-    ten ∷ s → s → s → Ctx (Exp i) → s
-    ten n a m = \c → case c of
-                       CtxAdd _ (Lit 10) _ → a
-                       CtxMul _ (Lit 10) _ → m
-                       _                   → n
-
-ordinalRepr ∷ (Exp i → Exp i → Ctx (Exp i) → Text) → Repr i
-ordinalRepr f = (genericRepr f)
-                { reprValue = \_ n → M.lookup n syms
-                , reprScale = BN.scaleRepr (BN.ordQuantityName "illion" "illionth"
-                                                               "illion" "illionth"
-                                           )
-                                           []
-                }
-    where
-      syms =
-          M.fromList
-          [ (0, const "zeroth")
-          , (1, \c → case c of
-                       _ | isOutside R c → "first"
-                         | otherwise     → "one"
-            )
-          , (2, ten   "second" "two"   "two"  "twen")
-          , (3, ten   "third"  "three" "thir" "thir")
-          , (4, ten   "fourth" "four"  "four" "for")
-          , (5, ten   "fifth"  "five"  "fif"  "fif")
-          , (6, \c → if isOutside R c then "sixth"   else "six")
-          , (7, \c → if isOutside R c then "seventh" else "seven")
-          , (8, ten   "eighth" "eight" "eigh" "eigh")
-          , (9, \c → if isOutside R c then "ninth"   else "nine")
-          , (10, \c → case c of
-                        CtxAdd _ (Lit _) _ | isOutside R c → "teenth"
-                                           | otherwise     → "teen"
-                        CtxMul R _       _ | isOutside R c → "tieth"
-                                           | otherwise     → "ty"
-                        _                  | isOutside R c → "tenth"
-                                           | otherwise     → "ten"
-            )
-          , (11,   \c → if isOutside R c then "eleventh"   else "eleven")
-          , (12,   \c → if isOutside R c then "twelfth"    else "twelf")
-          , (100,  \c → if isOutside R c then "hundreth"   else "hundred")
-          , (1000, \c → if isOutside R c then "thousandth" else "thousand")
-          ]
-
-      ten ∷ s -- ^ Ordinal form.
-          → s -- ^ Cardinal form; normal.
-          → s -- ^ Cardinal form; added to ten.
-          → s -- ^ Cardinal form; multiplied with ten.
-          → Ctx (Exp i)
-          → s
-      ten o n a m ctx = case ctx of
-                          _ | isOutside R ctx → o
-                          CtxAdd _ (Lit 10) _ → a
-                          CtxMul _ (Lit 10) _ → m
-                          _                   → n
diff --git a/src/Text/Numeral/Language/ENG.hs b/src/Text/Numeral/Language/ENG.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/ENG.hs
@@ -0,0 +1,232 @@
+{-|
+[@ISO639-1@]        en
+
+[@ISO639-2B@]       eng
+
+[@ISO639-3@]        eng
+
+[@Native name@]     English
+
+[@English name@]    English
+-}
+
+module Text.Numeral.Language.ENG
+    ( -- * Language entries
+      gb_entry
+    , us_entry
+      -- * Conversions
+    , gb_cardinal
+    , gb_ordinal
+    , gbPelletier_cardinal
+    , us_cardinal
+    , us_ordinal
+      -- * Structure
+    , shortScaleStruct
+    , pelletierScaleStruct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- ENG
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "en"
+    , entIso639_2    = ["eng"]
+    , entIso639_3    = Just "eng"
+    , entNativeNames = ["English"]
+    , entEnglishName = Just "English"
+    }
+
+gb_entry :: Entry
+gb_entry = entry
+    { entVariant  = Just "en-GB"
+    , entCardinal = Just Conversion
+                    { toNumeral   = gb_cardinal
+                    , toStructure = shortScaleStruct
+                    }
+    , entOrdinal  = Just Conversion
+                    { toNumeral   = gb_ordinal
+                    , toStructure = shortScaleStruct
+                    }
+    }
+
+us_entry :: Entry
+us_entry = entry
+    { entVariant  = Just "en-US"
+    , entCardinal = Just Conversion
+                    { toNumeral   = us_cardinal
+                    , toStructure = shortScaleStruct
+                    }
+    , entOrdinal  = Just Conversion
+                    { toNumeral   = us_ordinal
+                    , toStructure = shortScaleStruct
+                    }
+    }
+
+gb_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+gb_cardinal inf = render (cardinalRepr "minus " gb_add) inf . shortScaleStruct
+
+gb_ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+gb_ordinal inf = render (ordinalRepr gb_add) inf . shortScaleStruct
+
+gbPelletier_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+gbPelletier_cardinal inf = render (cardinalRepr "minus " gb_add) { reprScale = pelletierRepr } inf
+                         . pelletierScaleStruct
+  where
+    pelletierRepr = BN.pelletierRepr (\_ _ -> "illion")
+                                     (\_ _ -> "illiard")
+                                     []
+
+us_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+us_cardinal inf = render (cardinalRepr "negative " us_add) inf . shortScaleStruct
+
+us_ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+us_ordinal inf = render (ordinalRepr us_add) inf . shortScaleStruct
+
+shortScaleStruct :: (Integral a) => a -> Exp
+shortScaleStruct = pos $ fix $ rule `combine` shortScale1 R L BN.rule
+
+pelletierScaleStruct :: (Integral a) => a -> Exp
+pelletierScaleStruct = pos $ fix $ rule `combine` pelletierScale1 R L BN.rule
+
+rule :: (Integral a) => Rule a
+rule = findRule (   0, lit       )
+              [ (  13, add 10 L  )
+              , (  20, mul 10 R L)
+              , ( 100, step1  100   10 R L)
+              , (1000, step1 1000 1000 R L)
+              ]
+                (dec 6 - 1)
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 30003 - 1 in (negate x, x)
+
+genericRepr :: (Exp -> Exp -> Ctx Exp -> Text) -- ^ Add representation.
+            -> Repr
+genericRepr f =
+    defaultRepr
+    { reprAdd   = Just f
+    , reprMul   = Just (⊞)
+    }
+    where
+      (_ ⊞ Lit 10) _ = ""
+      (_ ⊞ _     ) _ = " "
+
+gb_add :: Exp -> Exp -> Ctx Exp -> Text
+((_ `Mul` Lit 10) `gb_add` _) _ = "-"
+((_ `Mul` _     ) `gb_add` _x) _
+    --  | eval x < (100 :: Integer) = " and "
+    | otherwise                 = " "
+(_                `gb_add` _) _ = ""
+
+us_add :: Exp -> Exp -> Ctx Exp -> Text
+((_ `Mul` Lit 10) `us_add` _) _ = "-"
+((_ `Mul` _     ) `us_add` _) _ = " "
+(_                `us_add` _) _ = ""
+
+cardinalRepr :: Text -- ^ Negative number prefix.
+             -> (Exp -> Exp -> Ctx Exp -> Text)
+             -> Repr
+cardinalRepr neg f =
+    (genericRepr f)
+    { reprValue = \_ n -> M.lookup n syms
+    , reprScale = BN.scaleRepr (\_ _ -> "illion") []
+    , reprNeg   = Just $ \_ _ -> neg
+    }
+  where
+    syms =
+        M.fromList
+        [ (0, const "zero")
+        , (1, const "one")
+        , (2, ten   "two"   "two"  "twen")
+        , (3, ten   "three" "thir" "thir")
+        , (4, ten   "four"  "four" "for")
+        , (5, ten   "five"  "fif"  "fif")
+        , (6, const "six")
+        , (7, const "seven")
+        , (8, ten   "eight" "eigh" "eigh")
+        , (9, const "nine")
+        , (10, \c -> case c of
+                      CtxAdd _ (Lit _) _ -> "teen"
+                      CtxMul R _       _ -> "ty"
+                      _                  -> "ten"
+          )
+        , (11,   const "eleven")
+        , (12,   const "twelve")
+        , (100,  const "hundred")
+        , (1000, const "thousand")
+        ]
+
+    ten :: s -> s -> s -> Ctx Exp -> s
+    ten n a m = \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> a
+                       CtxMul _ (Lit 10) _ -> m
+                       _                   -> n
+
+ordinalRepr :: (Exp -> Exp -> Ctx Exp -> Text) -> Repr
+ordinalRepr f = (genericRepr f)
+                { reprValue = \_ n -> M.lookup n syms
+                , reprScale = BN.scaleRepr (BN.ordQuantityName "illion" "illionth"
+                                                               "illion" "illionth"
+                                           )
+                                           []
+                }
+    where
+      syms =
+          M.fromList
+          [ (0, const "zeroth")
+          , (1, \c -> case c of
+                       _ | isOutside R c -> "first"
+                         | otherwise     -> "one"
+            )
+          , (2, ten   "second" "two"   "two"  "twen")
+          , (3, ten   "third"  "three" "thir" "thir")
+          , (4, ten   "fourth" "four"  "four" "for")
+          , (5, ten   "fifth"  "five"  "fif"  "fif")
+          , (6, \c -> if isOutside R c then "sixth"   else "six")
+          , (7, \c -> if isOutside R c then "seventh" else "seven")
+          , (8, ten   "eighth" "eight" "eigh" "eigh")
+          , (9, \c -> if isOutside R c then "ninth"   else "nine")
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit _) _ | isOutside R c -> "teenth"
+                                           | otherwise     -> "teen"
+                        CtxMul R _       _ | isOutside R c -> "tieth"
+                                           | otherwise     -> "ty"
+                        _                  | isOutside R c -> "tenth"
+                                           | otherwise     -> "ten"
+            )
+          , (11,   \c -> if isOutside R c then "eleventh"   else "eleven")
+          , (12,   \c -> if isOutside R c then "twelfth"    else "twelf")
+          , (100,  \c -> if isOutside R c then "hundreth"   else "hundred")
+          , (1000, \c -> if isOutside R c then "thousandth" else "thousand")
+          ]
+
+      ten :: s -- ^ Ordinal form.
+          -> s -- ^ Cardinal form; normal.
+          -> s -- ^ Cardinal form; added to ten.
+          -> s -- ^ Cardinal form; multiplied with ten.
+          -> Ctx Exp
+          -> s
+      ten o n a m ctx =
+          case ctx of
+            _ | isOutside R ctx -> o
+            CtxAdd _ (Lit 10) _ -> a
+            CtxMul _ (Lit 10) _ -> m
+            _                   -> n
diff --git a/src/Text/Numeral/Language/EO.hs b/src/Text/Numeral/Language/EO.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/EO.hs
+++ /dev/null
@@ -1,100 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        eo
-
-[@ISO639-2B@]       epo
-
-[@ISO639-3@]        epo
-
-[@Native name@]     Esperanto
-
-[@English name@]    Esperanto
--}
-
-module Text.Numeral.Language.EO
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- EO
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "eo"
-    , entIso639_2    = ["epo"]
-    , entIso639_3    = Just "epo"
-    , entNativeNames = ["Esperanto"]
-    , entEnglishName = Just "Esperanto"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
-struct = checkPos
-       $ fix
-       $ findRule (  0, lit            )
-                [ ( 11, step 10  10 R L)
-                , (100, step 100 10 R L)
-                ]
-                  1000
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = (0, 1000)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just $ \_ _ _ → " "
-               , reprMul   = Just $ \_ _ _ → ""
-               }
-    where
-      syms =
-          M.fromList
-          [ (0, const "nul")
-          , (1, const "unu")
-          , (2, const "du")
-          , (3, const "tri")
-          , (4, const "kvar")
-          , (5, const "kvin")
-          , (6, const "ses")
-          , (7, const "sep")
-          , (8, const "ok")
-          , (9, const "naŭ")
-          , (10, const "dek")
-          , (100, const "cent")
-          , (1000, const "mil")
-          ]
diff --git a/src/Text/Numeral/Language/EPO.hs b/src/Text/Numeral/Language/EPO.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/EPO.hs
@@ -0,0 +1,90 @@
+{-|
+[@ISO639-1@]        eo
+
+[@ISO639-2B@]       epo
+
+[@ISO639-3@]        epo
+
+[@Native name@]     Esperanto
+
+[@English name@]    Esperanto
+-}
+
+module Text.Numeral.Language.EPO
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- EPO
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "eo"
+    , entIso639_2    = ["epo"]
+    , entIso639_3    = Just "epo"
+    , entNativeNames = ["Esperanto"]
+    , entEnglishName = Just "Esperanto"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = checkPos
+       $ fix
+       $ findRule (  0, lit            )
+                [ ( 11, step 10  10 R L)
+                , (100, step 100 10 R L)
+                ]
+                  1000
+
+bounds :: (Integral a) => (a, a)
+bounds = (0, 1000)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just $ \_ _ _ -> " "
+               , reprMul   = Just $ \_ _ _ -> ""
+               }
+    where
+      syms =
+          M.fromList
+          [ (0, const "nul")
+          , (1, const "unu")
+          , (2, const "du")
+          , (3, const "tri")
+          , (4, const "kvar")
+          , (5, const "kvin")
+          , (6, const "ses")
+          , (7, const "sep")
+          , (8, const "ok")
+          , (9, const "naŭ")
+          , (10, const "dek")
+          , (100, const "cent")
+          , (1000, const "mil")
+          ]
diff --git a/src/Text/Numeral/Language/ES.hs b/src/Text/Numeral/Language/ES.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/ES.hs
+++ /dev/null
@@ -1,207 +0,0 @@
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        es
-
-[@ISO639-2B@]       spa
-
-[@ISO639-3@]        spa
-
-[@Native name@]     Español
-
-[@English name@]    Spanish
--}
-
-module Text.Numeral.Language.ES
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( (<) )
-import "base" Prelude       ( (-), negate, Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Prelude.Unicode       ( ℤ )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum  as BN
-import qualified "this" Text.Numeral.Exp     as E
-import qualified "this" Text.Numeral.Grammar as G
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
--------------------------------------------------------------------------------
--- ES
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "es"
-    , entIso639_2    = ["spa"]
-    , entIso639_3    = Just "spa"
-    , entNativeNames = ["Español"]
-    , entEnglishName = Just "Spanish"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ ( G.Feminine i, G.Masculine i
-           , Integral α, E.Scale α
-           )
-         ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         , E.Inflection β, G.Masculine (E.Inf β)
-         )
-       ⇒ α → β
-struct = pos $ fix $ rule `combine` longScale1_es
-    where
-      rule = findRule (   0, lit       )
-                    [ (  11, add 10 L  )
-                    , (  16, add 10 R  )
-                    , (  20, lit       )
-                    , (  21, add 20 R  )
-                    , (  30, mul 10 R L)
-                    , ( 100, step  100   10 R L)
-                    , (1000, step 1000 1000 R L)
-                    ]
-                    (dec 6 - 1)
-
--- | Like 'longScale1' with the difference that all scale elements are
--- masculine.
-longScale1_es ∷ ( Integral α, E.Scale α
-                , E.Unknown β, E.Lit β, E.Add β, E.Mul β, E.Scale β
-                , E.Inflection β, G.Masculine (E.Inf β)
-                )
-              ⇒ Rule α β
-longScale1_es = mulScale1_es 6 0 R L BN.rule
-    where
-      mulScale1_es = mulScale_ $ \f m s _ → masculineMul (f m) s
-      masculineMul x y = E.inflection (G.masculine) $ E.mul x y
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-cardinalRepr ∷ ( G.Feminine i, G.Masculine i)
-             ⇒ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
-               , reprScale = longScaleRepr
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               , reprNeg   = Just $ \_ _ → "menos "
-               }
-    where
-      (_                    ⊞ Lit 10) _ = ""
-      (Lit 10               ⊞ _     ) _ = ""
-      (Lit 20               ⊞ _     ) _ = ""
-      ((Lit _ `Mul` Lit 10) ⊞ _     ) _ = " y "
-      (_                    ⊞ _     ) _ = " "
-
-      (_ ⊡ Lit n) _ | n < 1000 = ""
-      (_ ⊡ _    ) _            = " "
-
-      syms inf =
-          M.fromList
-          [ (0, const "cero")
-          , (1, \c → case c of
-                       CtxAdd _ (Lit 10)  _    → "on"
-                       CtxAdd _ (Lit 20)  _
-                           | G.isMasculine inf → "ún"
-                       _   | G.isFeminine  inf → "una"
-                           | G.isMasculine inf → "un"
-                           | otherwise         → "uno"
-            )
-          , (2, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "do"
-                       CtxAdd _ (Lit 20)  _ → "dós"
-                       _                    → "dos"
-            )
-          , (3, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "tre"
-                       CtxAdd _ (Lit 20)  _ → "trés"
-                       CtxMul _ (Lit 10)  _ → "trein"
-                       _                    → "tres"
-            )
-          , (4, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "cator"
-                       CtxMul _ (Lit 10)  _ → "cuaren"
-                       _                    → "cuatro"
-            )
-          , (5, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "quin"
-                       CtxMul _ (Lit 10)  _ → "cincuen"
-                       CtxMul _ (Lit 100) _ → "quin"
-                       _                    → "cinco"
-            )
-          , (6, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "séis"
-                       CtxAdd _ (Lit 20)  _ → "séis"
-                       CtxMul _ (Lit 10)  _ → "sesen"
-                       _                    → "seis"
-            )
-          , (7, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "seten"
-                       CtxMul _ (Lit 100) _ → "sete"
-                       _                    → "siete"
-            )
-          , (8, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "ochen"
-                       _                    → "ocho"
-            )
-          , (9, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "noven"
-                       CtxMul _ (Lit 100) _ → "nove"
-                       _                    → "nueve"
-            )
-          , (10, \c → case c of
-                        CtxAdd R (Lit _)  _ → "ce"
-                        CtxAdd L (Lit _)  _ → "dieci"
-                        CtxMul R _        _ → "ta"
-                        _                   → "diez"
-            )
-          , (20, \c → case c of
-                        CtxAdd _ (Lit _)  _ → "veinti"
-                        _                   → "veinte"
-            )
-          , (100, \c → case c of
-                         CtxEmpty             → "cien"
-                         CtxAdd {}            → "ciento"
-                         CtxMul _ (Lit 5) _
-                           | G.isFeminine inf → "ientas"
-                           | otherwise        → "ientos"
-                         CtxMul L _       _   → "cien"
-                         _ | G.isFeminine inf → "cientas"
-                           | otherwise        → "cientos"
-            )
-          , (1000, const "mil")
-          ]
-
-longScaleRepr ∷ i → ℤ → ℤ → (Exp i) → Ctx (Exp i) → Maybe Text
-longScaleRepr =
-    BN.scaleRepr (BN.quantityName "illón" "illones")
-                 [ (4, BN.forms "cuatr" "cuator" "cuator" "cuatra" "cuatri")
-                 , (9, BN.forms "non"   "noven"  "noven"  "nona"   "non")
-                 ]
diff --git a/src/Text/Numeral/Language/Entries.hs b/src/Text/Numeral/Language/Entries.hs
--- a/src/Text/Numeral/Language/Entries.hs
+++ b/src/Text/Numeral/Language/Entries.hs
@@ -10,108 +10,96 @@
 --------------------------------------------------------------------------------
 
 import "this" Text.Numeral.Entry ( Entry(..) )
-import qualified "this" Text.Numeral.Language.AF  as AF
+import qualified "this" Text.Numeral.Language.AFR as AFR
 import qualified "this" Text.Numeral.Language.AMP as AMP
-import qualified "this" Text.Numeral.Language.BG  as BG
+import qualified "this" Text.Numeral.Language.BUL as BUL
+import qualified "this" Text.Numeral.Language.CES as CES
 import qualified "this" Text.Numeral.Language.CHN as CHN
 import qualified "this" Text.Numeral.Language.CHR as CHR
 import qualified "this" Text.Numeral.Language.CLM as CLM
-import qualified "this" Text.Numeral.Language.CS  as CS
--- import qualified "this" Text.Numeral.Language.CY  as CY
--- import qualified "this" Text.Numeral.Language.DA  as DA
-import qualified "this" Text.Numeral.Language.DE  as DE
-import qualified "this" Text.Numeral.Language.EN  as EN
-import qualified "this" Text.Numeral.Language.EO  as EO
-import qualified "this" Text.Numeral.Language.ES  as ES
--- import qualified "this" Text.Numeral.Language.ET  as ET
-import qualified "this" Text.Numeral.Language.FI  as FI
-import qualified "this" Text.Numeral.Language.FR  as FR
+import qualified "this" Text.Numeral.Language.DEU as DEU
+import qualified "this" Text.Numeral.Language.ENG as ENG
+import qualified "this" Text.Numeral.Language.EPO as EPO
+import qualified "this" Text.Numeral.Language.FIN as FIN
+import qualified "this" Text.Numeral.Language.FRA as FRA
 import qualified "this" Text.Numeral.Language.FUR as FUR
+import qualified "this" Text.Numeral.Language.GLV as GLV
 import qualified "this" Text.Numeral.Language.GSW as GSW
-import qualified "this" Text.Numeral.Language.GV  as GV
-import qualified "this" Text.Numeral.Language.HE  as HE
+import qualified "this" Text.Numeral.Language.HEB as HEB
 import qualified "this" Text.Numeral.Language.HOP as HOP
--- import qualified "this" Text.Numeral.Language.HR  as HR
--- import qualified "this" Text.Numeral.Language.HU  as HU
-import qualified "this" Text.Numeral.Language.IT  as IT
-import qualified "this" Text.Numeral.Language.JA  as JA
-import qualified "this" Text.Numeral.Language.LA  as LA
+import qualified "this" Text.Numeral.Language.ITA as ITA
+import qualified "this" Text.Numeral.Language.JPN as JPN
+import qualified "this" Text.Numeral.Language.LAT as LAT
 import qualified "this" Text.Numeral.Language.LLD as LLD
-import qualified "this" Text.Numeral.Language.MG  as MG
-import qualified "this" Text.Numeral.Language.NL  as NL
-import qualified "this" Text.Numeral.Language.NO  as NO
+import qualified "this" Text.Numeral.Language.MLG as MLG
+import qualified "this" Text.Numeral.Language.NEN as NEN
+import qualified "this" Text.Numeral.Language.NLD as NLD
+import qualified "this" Text.Numeral.Language.NOB as NOB
 import qualified "this" Text.Numeral.Language.NQM as NQM
-import qualified "this" Text.Numeral.Language.OJ  as OJ
--- import qualified "this" Text.Numeral.Language.PAA as PAA
+import qualified "this" Text.Numeral.Language.OJI as OJI
 import qualified "this" Text.Numeral.Language.PDC as PDC
-import qualified "this" Text.Numeral.Language.PL  as PL
-import qualified "this" Text.Numeral.Language.PT  as PT
--- import qualified "this" Text.Numeral.Language.RO  as RO
-import qualified "this" Text.Numeral.Language.RU  as RU
+import qualified "this" Text.Numeral.Language.POL as POL
+import qualified "this" Text.Numeral.Language.POR as POR
+import qualified "this" Text.Numeral.Language.RUS as RUS
 import qualified "this" Text.Numeral.Language.SCO as SCO
-import qualified "this" Text.Numeral.Language.SV  as SV
-import qualified "this" Text.Numeral.Language.TR  as TR
-import qualified "this" Text.Numeral.Language.WO  as WO
+import qualified "this" Text.Numeral.Language.SPA as SPA
+import qualified "this" Text.Numeral.Language.SWE as SWE
+import qualified "this" Text.Numeral.Language.TUR as TUR
+import qualified "this" Text.Numeral.Language.WOL as WOL
 import qualified "this" Text.Numeral.Language.YOR as YOR
-import qualified "this" Text.Numeral.Language.ZH  as ZH
+import qualified "this" Text.Numeral.Language.ZHO as ZHO
 
 
 --------------------------------------------------------------------------------
 -- Language entries
 --------------------------------------------------------------------------------
 
-entries ∷ [Entry]
+entries :: [Entry]
 entries =
-  [ AF.entry
+  [ AFR.entry
   , AMP.entry
-  , BG.entry
+  , BUL.entry
   , CHN.entry
   , CHR.entry
   , CLM.entry
-  , CS.entry
---, CY.entry
---, DA.entry
-  , DE.entry
-  , EN.gb_entry
-  , EN.us_entry
-  , EO.entry
-  , ES.entry
---, ET.entry
-  , FI.entry
-  , FR.entry
+  , CES.entry
+  , DEU.entry
+  , ENG.gb_entry
+  , ENG.us_entry
+  , EPO.entry
+  , SPA.entry
+  , FIN.entry
+  , FRA.entry
   , FUR.entry
   , GSW.entry
-  , GV.entry
-  , HE.entry
+  , GLV.entry
+  , HEB.entry
   , HOP.entry
---, HR.entry
---, HU.entry
-  , IT.entry
-  , JA.daiji_entry
-  , JA.kanji_entry
-  , JA.on'yomi_entry
-  , JA.preferred_entry
-  , LA.entry
+  , ITA.entry
+  , JPN.daiji_entry
+  , JPN.kanji_entry
+  , JPN.on'yomi_entry
+  , JPN.preferred_entry
+  , LAT.entry
   , LLD.entry
-  , MG.entry
-  , NL.entry
-  , NO.entry
+  , MLG.entry
+  , NEN.entry
+  , NLD.entry
+  , NOB.entry
   , NQM.entry
-  , OJ.entry
---, PAA.entry
+  , OJI.entry
   , PDC.entry
-  , PL.entry
-  , PT.entry
---, RO.entry
-  , RU.entry
+  , POL.entry
+  , POR.entry
+  , RUS.entry
   , SCO.entry
-  , SV.entry
-  , TR.entry
-  , WO.entry
+  , SWE.entry
+  , TUR.entry
+  , WOL.entry
   , YOR.entry
-  , ZH.finance_simpl_entry
-  , ZH.finance_trad_entry
-  , ZH.pinyin_entry
-  , ZH.simpl_entry
-  , ZH.trad_entry
+  , ZHO.finance_simpl_entry
+  , ZHO.finance_trad_entry
+  , ZHO.pinyin_entry
+  , ZHO.simpl_entry
+  , ZHO.trad_entry
   ]
diff --git a/src/Text/Numeral/Language/FI.hs b/src/Text/Numeral/Language/FI.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/FI.hs
+++ /dev/null
@@ -1,960 +0,0 @@
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        fi
-
-[@ISO639-2B@]       fin
-
-[@ISO639-3@]        fin
-
-[@Native name@]     suomi
-
-[@English name@]    Finnish
--}
-
-module Text.Numeral.Language.FI
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-    , ordinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), fix, flip )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Num, Integral, (-), negate, divMod )
-import "base-unicode-symbols" Data.Bool.Unicode     ( (∧) )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum  as BN
-import qualified "this" Text.Numeral.Exp     as E
-import qualified "this" Text.Numeral.Grammar as G
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
--------------------------------------------------------------------------------
--- FI
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "fi"
-    , entIso639_2    = ["fin"]
-    , entIso639_3    = Just "fin"
-    , entNativeNames = ["suomi"]
-    , entEnglishName = Just "Finnish"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    , entOrdinal     = Just Conversion
-                       { toNumeral   = ordinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ ( G.Singular i, G.Plural i
-           , G.Abessive i
-           , G.Accusative i
-           , G.Comitative i
-           , G.Delative i
-           , G.Distributive i
-           , G.DistributiveTemporal i
-           , G.Essive i
-           , G.Genitive i
-           , G.Instructive i
-           , G.Lative i
-           , G.LocativeInessive i
-           , G.LocativeElative i
-           , G.LocativeIllative i
-           , G.LocativeAdessive i
-           , G.LocativeAblative i
-           , G.LocativeAllative i
-           , G.Multiplicative i
-           , G.Nominative i
-           , G.Partitive i
-           , G.Sublative i
-           , G.SuperEssive i
-           , G.Translative i
-           , Integral α, E.Scale α
-           )
-         ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-ordinal ∷ ( G.Singular i, G.Plural i
-          , G.Abessive i
-          , G.Accusative i
-          , G.Comitative i
-          , G.Delative i
-          , G.Distributive i
-          , G.DistributiveTemporal i
-          , G.Essive i
-          , G.Genitive i
-          , G.Instructive i
-          , G.Lative i
-          , G.LocativeInessive i
-          , G.LocativeElative i
-          , G.LocativeIllative i
-          , G.LocativeAdessive i
-          , G.LocativeAblative i
-          , G.LocativeAllative i
-          , G.Multiplicative i
-          , G.Nominative i
-          , G.Partitive i
-          , G.Sublative i
-          , G.SuperEssive i
-          , G.Translative i
-          , Integral α, E.Scale α
-          )
-        ⇒ i → α → Maybe Text
-ordinal inf = ordinalRepr inf ∘ struct
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Add β, E.Mul β
-         , E.Inflection β, E.Scale β
-         , G.Singular   (E.Inf β)
-         , G.Nominative (E.Inf β)
-         , G.Accusative (E.Inf β)
-         , G.Partitive  (E.Inf β)
-         )
-       ⇒ α → β
-struct = fix $ rule `combine` pelletierScale R L BN.rule
-    where
-      rule = findRule (   0, lit)
-                    [ (  11, add 10 L)
-                    , (  20, fi_mul 10)
-                    , ( 100, step  100   10 R L)
-                    , (1000, step 1000 1000 R L)
-                    ]
-                      (dec 6 - 1)
-
--- | Like the normal 'mul' rule with the difference that the value
--- that is multiplied is changed to the partitive case.
-fi_mul ∷ ( Integral α
-         , E.Add β, E.Mul β, E.Inflection β
-         , G.Singular   (E.Inf β)
-         , G.Nominative (E.Inf β)
-         , G.Accusative (E.Inf β)
-         , G.Partitive  (E.Inf β)
-         )
-       ⇒ α → Rule α β
-fi_mul val =
-    \f n → let (m, a) = n `divMod` val
-               mval = E.mul (f m) (E.inflection toPartitive $ f val)
-           in if a ≡ 0
-              then mval
-              else (flip E.add) (f a) mval
-  where
-    toPartitive ∷ (G.Singular i, G.Nominative i, G.Accusative i, G.Partitive i)
-                ⇒ i → i
-    toPartitive inf | G.isSingular inf ∧ G.isNominative inf = G.partitive inf
-                    | G.isSingular inf ∧ G.isAccusative inf = G.partitive inf
-                    | otherwise = inf
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 15 - 1 in (negate x, x)
-
-cardinalRepr ∷ ( G.Singular i, G.Plural i
-               , G.Abessive i
-               , G.Accusative i
-               , G.Comitative i
-               , G.Delative i
-               , G.Distributive i
-               , G.DistributiveTemporal i
-               , G.Essive i
-               , G.Genitive i
-               , G.Instructive i
-               , G.Lative i
-               , G.LocativeInessive i
-               , G.LocativeElative i
-               , G.LocativeIllative i
-               , G.LocativeAdessive i
-               , G.LocativeAblative i
-               , G.LocativeAllative i
-               , G.Multiplicative i
-               , G.Nominative i
-               , G.Partitive i
-               , G.Sublative i
-               , G.SuperEssive i
-               , G.Translative i
-               )
-             ⇒ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
-               , reprScale = BN.pelletierRepr
-                               (BN.quantityName "iljoona" "iljoonaa")
-                               (BN.quantityName "iljardi" "iljardia")
-                               []
-               , reprAdd   = Just $ \_ _ _ → ""
-               , reprMul   = Just $ \_ _ _ → ""
-               }
-    where
-      syms inf =
-          M.fromList
-          [ (0, \c → infForms inf c
-                              -- singular
-                              "nolla"    {- nom -} "nolla"    {- acc -}
-                              "nollan"   {- gen -} "nollaa"   {- ptv -}
-                              "nollana"  {- ess -} "nollaksi" {- transl -}
-                              "nollassa" {- ine -} "nollasta" {- ela -}
-                              "nollaan"  {- ill -} "nollalla" {- ade -}
-                              "nollalta" {- abl -} "nollalle" {- all -}
-                              "nollatta" {- abe -}
-                              "?"        {- other -}
-                              -- plural
-                              "nollat"   {- nom -} "nollat"   {- acc -}
-                              "nollien"  {- gen -} "nollia"   {- ptv -}
-                              "nollina"  {- ess -} "nolliksi" {- transl -}
-                              "nollissa" {- ine -} "nollista" {- ela -}
-                              "nolliin"  {- ill -} "nollilla" {- ade -}
-                              "nollilta" {- abl -} "nollille" {- all -}
-                              "nollitta" {- abe -} "nolline"  {- com -}
-                              "nollin"   {- instr -}
-                              "?"        {- other -}
-            )
-         , (1, \c → infForms inf c
-                             -- singular
-                             "yksi"     {- nom -} "yksi"     {- acc -}
-                             "yhden"    {- gen -} "yhtä"     {- ptv -}
-                             "yhtenä"   {- ess -} "yhdeksi"  {- transl -}
-                             "yhdessä"  {- ine -} "yhdestä"  {- ela -}
-                             "yhteen"   {- ill -} "yhdellä"  {- ade -}
-                             "yhdeltä"  {- abl -} "yhdelle"  {- all -}
-                             "yhdettä"  {- abe -}
-                             (case inf of
-                                _ | G.isSuperEssive    inf → "yhtäällä"
-                                  | G.isDelative       inf → "yhtäältä"
-                                  | G.isSublative      inf → "yhtäälle"
-                                  | G.isLative         inf → "yhä"
-                                  | G.isMultiplicative inf → "yhdesti"
-                                  | otherwise              → "?"
-                             )
-                             -- plural
-                             "yhdet"    {- nom -} "yhdet"    {- acc -}
-                             "yksien"   {- gen -} "yksiä"    {- ptv -}
-                             "yksinä"   {- ess -} "yksiksi"  {- transl -}
-                             "yksissä"  {- ine -} "yksistä"  {- ela -}
-                             "yksiin"   {- ill -} "yksillä"  {- ade -}
-                             "yksiltä"  {- abl -} "yksille"  {- all -}
-                             "yksittä"  {- abe -} "yksine"   {- com -}
-                             "yksin"    {- instr -}
-                             (case inf of
-                                _ | G.isDistributive inf → "yksittäin"
-                                  | otherwise            → "?"
-                             )
-           )
-          , (2, \c → infForms inf c
-                              -- singular
-                              "kaksi"    {- nom -} "kaksi"    {- acc -}
-                              "kahden"   {- gen -} "kahta"    {- ptv -}
-                              "kahtena"  {- ess -} "kahdeksi" {- transl -}
-                              "kahdessa" {- ine -} "kahdesta" {- ela -}
-                              "kahteen"  {- ill -} "kahdella" {- ade -}
-                              "kahdelta" {- abl -} "kahdelle" {- all -}
-                              "kahdetta" {- abe -}
-                              (case inf of
-                                 _ | G.isInstructive    inf → "kahden"
-                                   | G.isSuperEssive    inf → "kahtaalla"
-                                   | G.isDelative       inf → "kahtaalta"
-                                   | G.isSublative      inf → "kahtaalle"
-                                   | G.isLative         inf → "kahtia"
-                                   | G.isMultiplicative inf → "kahdesti"
-                                   | otherwise              → "?"
-                              )
-                              -- plural
-                              "kahdet"   {- nom -} "kahdet"   {- acc -}
-                              "kaksien"  {- gen -} "kaksia"   {- ptv -}
-                              "kaksina"  {- ess -} "kaksiksi" {- transl -}
-                              "kaksissa" {- ine -} "kaksista" {- ela -}
-                              "kaksiin"  {- ill -} "kaksilla" {- ade -}
-                              "kaksilta" {- abl -} "kaksille" {- all -}
-                              "kaksitta" {- abe -} "kaksine"  {- com -}
-                              "kaksin"   {- instr -}
-                              (case inf of
-                                 _ | G.isDistributive inf → "kaksittain"
-                                   | otherwise            → "?"
-                              )
-            )
-          , (3, \c → infForms inf c
-                              -- singular
-                              "kolme"    {- nom -} "kolme"    {- acc -}
-                              "kolmen"   {- gen -} "kolmea"   {- ptv -}
-                              "kolmena"  {- ess -} "kolmeksi" {- transl -}
-                              "kolmessa" {- ine -} "kolmesta" {- ela -}
-                              "kolmeen"  {- ill -} "kolmella" {- ade -}
-                              "kolmelta" {- abl -} "kolmelle" {- all -}
-                              "kolmetta" {- abe -}
-                              (case inf of
-                                 _ | G.isInstructive    inf → "kolmen"
-                                   | G.isLative         inf → "kolmia"
-                                   | G.isMultiplicative inf → "kolmesti"
-                                   | otherwise              → "?"
-                              )
-                              -- plural
-                              "kolmet"   {- nom -} "kolmet"   {- acc -}
-                              "kolmien"  {- gen -} "kolmia"   {- ptv -}
-                              "kolmina"  {- ess -} "kolmiksi" {- transl -}
-                              "kolmissa" {- ine -} "kolmista" {- ela -}
-                              "kolmiin"  {- ill -} "kolmilla" {- ade -}
-                              "kolmilta" {- abl -} "kolmille" {- all -}
-                              "kolmitta" {- abe -} "kolmine"  {- com -}
-                              "kolmin"   {- instr -}
-                              (case inf of
-                                 _ | G.isDistributive         inf → "kolmittain"
-                                   | G.isDistributiveTemporal inf → "kolmisin"
-                                   | otherwise                    → "?"
-                              )
-            )
-          , (4, \c → infForms inf c
-                              -- singular
-                              "neljä"    {- nom -} "neljä"    {- acc -}
-                              "neljän"   {- gen -} "neljää"   {- ptv -}
-                              "neljänä"  {- ess -} "neljäksi" {- transl -}
-                              "neljässä" {- ine -} "neljästä" {- ela -}
-                              "neljään"  {- ill -} "neljällä" {- ade -}
-                              "neljältä" {- abl -} "neljälle" {- all -}
-                              "neljättä" {- abe -}
-                              "?"        {- other -}
-                              -- plural
-                              "neljät"   {- nom -} "neljät"   {- acc -}
-                              "neljien"  {- gen -} "neljiä"   {- ptv -}
-                              "neljinä"  {- ess -} "neljiksi" {- transl -}
-                              "neljissä" {- ine -} "neljistä" {- ela -}
-                              "neljiin"  {- ill -} "neljillä" {- ade -}
-                              "neljiltä" {- abl -} "neljille" {- all -}
-                              "neljittä" {- abe -} "neljine"  {- com -}
-                              "neljin"   {- instr -}
-                              "?"        {- other -}
-            )
-          , (5, \c → infForms inf c
-                              -- singular
-                              "viisi"    {- nom -} "viisi"    {- acc -}
-                              "viiden"   {- gen -} "viittä"   {- ptv -}
-                              "viitenä"  {- ess -} "viideksi" {- transl -}
-                              "viidessä" {- ine -} "viidestä" {- ela -}
-                              "viiteen"  {- ill -} "viidellä" {- ade -}
-                              "viideltä" {- abl -} "viidelle" {- all -}
-                              "viidettä" {- abe -}
-                              "?"        {- other -}
-                              -- plural
-                              "viidet"   {- nom -} "viidet"   {- acc -}
-                              "viisien"  {- gen -} "viisiä"   {- ptv -}
-                              "viisinä"  {- ess -} "viisiksi" {- transl -}
-                              "viisissä" {- ine -} "viisistä" {- ela -}
-                              "viisiin"  {- ill -} "viisillä" {- ade -}
-                              "viisiltä" {- abl -} "viisille" {- all -}
-                              "viisittä" {- abe -} "viisine"  {- com -}
-                              "viisin"   {- instr -}
-                              "?"        {- other -}
-            )
-          , (6, \c → infForms inf c
-                              -- singular
-                              "kuusi"    {- nom -} "kuusi"    {- acc -}
-                              "kuuden"   {- gen -} "kuutta"   {- ptv -}
-                              "kuutena"  {- ess -} "kuudeksi" {- transl -}
-                              "kuudessa" {- ine -} "kuudesta" {- ela -}
-                              "kuuteen"  {- ill -} "kuudella" {- ade -}
-                              "kuudelta" {- abl -} "kuudelle" {- all -}
-                              "kuudetta" {- abe -}
-                              "?"        {- other -}
-                              -- plural
-                              "kuudet"   {- nom -} "kuudet"   {- acc -}
-                              "kuusien"  {- gen -} "kuusia"   {- ptv -}
-                              "kuusina"  {- ess -} "kuusiksi" {- transl -}
-                              "kuusissa" {- ine -} "kuusista" {- ela -}
-                              "kuusiin"  {- ill -} "kuusilla" {- ade -}
-                              "kuusilta" {- abl -} "kuusille" {- all -}
-                              "kuusitta" {- abe -} "kuusine"  {- com -}
-                              "kuusin"   {- instr -}
-                              "?"        {- other -}
-            )
-          , (7, \c → infForms inf c
-                              -- singular
-                              "seitsemän"   {- nom -} "seitsemän"   {- acc -}
-                              "seitsemän"   {- gen -} "seitsemää"   {- ptv -}
-                              "seitsemänä"  {- ess -} "seitsemäksi" {- transl -}
-                              "seitsemässä" {- ine -} "seitsemästä" {- ela -}
-                              "seitsemään"  {- ill -} "seitsemällä" {- ade -}
-                              "seitsemältä" {- abl -} "seitsemälle" {- all -}
-                              "seitsemättä" {- abe -}
-                              "?"           {- other -}
-                              -- plural
-                              "seitsemät"   {- nom -} "seitsemät"   {- acc -}
-                              "seitsemien"  {- gen -} "seitsemiä"   {- ptv -}
-                              "seitseminä"  {- ess -} "seitsemiksi" {- transl -}
-                              "seitsemissä" {- ine -} "seitsemistä" {- ela -}
-                              "seitsemiin"  {- ill -} "seitsemillä" {- ade -}
-                              "seitsemiltä" {- abl -} "seitsemille" {- all -}
-                              "seitsemittä" {- abe -} "seitsemine"  {- com -}
-                              "seitsemin"   {- instr -}
-                              "?"           {- other -}
-            )
-          , (8, \c → infForms inf c
-                              -- singular
-                              "kahdeksan"   {- nom -} "kahdeksan"   {- acc -}
-                              "kahdeksan"   {- gen -} "kahdeksaa"   {- ptv -}
-                              "kahdeksana"  {- ess -} "kahdeksaksi" {- transl -}
-                              "kahdeksassa" {- ine -} "kahdeksasta" {- ela -}
-                              "kahdeksaan"  {- ill -} "kahdeksalla" {- ade -}
-                              "kahdeksalta" {- abl -} "kahdeksalle" {- all -}
-                              "kahdeksatta" {- abe -}
-                              "?"           {- other -}
-                              -- plural
-                              "kahdeksat"   {- nom -} "kahdeksat"   {- acc -}
-                              "kahdeksien"  {- gen -} "kahdeksia"   {- ptv -}
-                              "kahdeksina"  {- ess -} "kahdeksiksi" {- transl -}
-                              "kahdeksissa" {- ine -} "kahdeksista" {- ela -}
-                              "kahdeksiin"  {- ill -} "kahdeksilla" {- ade -}
-                              "kahdeksilta" {- abl -} "kahdeksille" {- all -}
-                              "kahdeksitta" {- abe -} "kahdeksine"  {- com -}
-                              "kahdeksin"   {- instr -}
-                              "?"           {- other -}
-            )
-          , (9, \c → infForms inf c
-                              -- singular
-                              "yhdeksän"   {- nom -} "yhdeksän"   {- acc -}
-                              "yhdeksän"   {- gen -} "yhdeksää"   {- ptv -}
-                              "yhdeksänä"  {- ess -} "yhdeksäksi" {- transl -}
-                              "yhdeksässä" {- ine -} "yhdeksästä" {- ela -}
-                              "yhdeksään"  {- ill -} "yhdeksällä" {- ade -}
-                              "yhdeksältä" {- abl -} "yhdeksälle" {- all -}
-                              "yhdeksättä" {- abe -}
-                              "?"          {- other -}
-                              -- plural
-                              "yhdeksät"   {- nom -} "yhdeksät"   {- acc -}
-                              "yhdeksien"  {- gen -} "yhdeksiä"   {- ptv -}
-                              "yhdeksinä"  {- ess -} "yhdeksiksi" {- transl -}
-                              "yhdeksissä" {- ine -} "yhdeksistä" {- ela -}
-                              "yhdeksiin"  {- ill -} "yhdeksillä" {- ade -}
-                              "yhdeksiltä" {- abl -} "yhdeksille" {- all -}
-                              "yhdeksittä" {- abe -} "yhdeksine"  {- com -}
-                              "yhdeksin"   {- instr -}
-                              "?"          {- other -}
-            )
-
-          , (10, \c → case c of
-                        CtxAdd _ (Lit _) _ → "toista" -- singular partitive ordinal 2
-                        _ → infForms inf c
-                              -- singular
-                              "kymmenen"   {- nom -} "kymmenen"   {- acc -}
-                              "kymmenen"   {- gen -} "kymmentä"   {- ptv -}
-                              "kymmenenä"  {- ess -} "kymmeneksi" {- transl -}
-                              "kymmenessä" {- ine -} "kymmenestä" {- ela -}
-                              "kymmeneen"  {- ill -} "kymmenellä" {- ade -}
-                              "kymmeneltä" {- abl -} "kymmenelle" {- all -}
-                              "kymmenettä" {- abe -}
-                              "?"          {- other -}
-                              -- plural
-                              "kymmenet"   {- nom -} "kymmenet"   {- acc -}
-                              "kymmenien"  {- gen -} "kymmeniä"   {- ptv -}
-                              "kymmeninä"  {- ess -} "kymmeniksi" {- transl -}
-                              "kymmenissä" {- ine -} "kymmenistä" {- ela -}
-                              "kymmeniin"  {- ill -} "kymmenillä" {- ade -}
-                              "kymmeniltä" {- abl -} "kymmenille" {- all -}
-                              "kymmenittä" {- abe -} "kymmenine"  {- com -}
-                              "kymmenin"   {- instr -}
-                              "?"          {- other -}
-            )
-          , (100, \c → case c of
-                         CtxMul _ (Lit n) _
-                             | n ≤ 9        → "sataa"
-                         _ → infForms inf c
-                               -- singular
-                               "sata"    {- nom -} "sata"    {- acc -}
-                               "sadan"   {- gen -} "sataa"   {- ptv -}
-                               "satana"  {- ess -} "sadaksi" {- transl -}
-                               "sadassa" {- ine -} "sadasta" {- ela -}
-                               "sataan"  {- ill -} "sadalla" {- ade -}
-                               "sadalta" {- abl -} "sadalle" {- all -}
-                               "sadatta" {- abe -}
-                               "?"       {- other -}
-                               -- plural
-                               "sadat"    {- nom -} "sadat"    {- acc -}
-                               "satojen"  {- gen -} "satoja"   {- ptv -}
-                               "satoina"  {- ess -} "sadoiksi" {- transl -}
-                               "sadoissa" {- ine -} "sadoista" {- ela -}
-                               "satoihin" {- ill -} "sadoilla" {- ade -}
-                               "sadoilta" {- abl -} "sadoille" {- all -}
-                               "sadoitta" {- abe -} "satoine"  {- com -}
-                               "sadoin"   {- instr -}
-                               "?"        {- other -}
-            )
-          , (1000, \c → case c of
-                          CtxMul {} → "tuhatta"
-                          _ → infForms inf c
-                                -- singular
-                                "tuhat"      {- nom -} "tuhat"      {- acc -}
-                                "tuhannen"   {- gen -} "tuhatta"    {- ptv -}
-                                "tuhantena"  {- ess -} "tuhanneksi" {- transl -}
-                                "tuhannessa" {- ine -} "tuhannesta" {- ela -}
-                                "tuhanteen"  {- ill -} "tuhannella" {- ade -}
-                                "tuhannelta" {- abl -} "tuhannelle" {- all -}
-                                "tuhannetta" {- abe -}
-                                "?"          {- other -}
-                                -- plural
-                                "tuhannet"   {- nom -} "tuhannet"   {- acc -}
-                                "tuhansien"  {- gen -} "tuhansia"   {- ptv -}
-                                "tuhansina"  {- ess -} "tuhansiksi" {- transl -}
-                                "tuhansissa" {- ine -} "tuhansista" {- ela -}
-                                "tuhansiin"  {- ill -} "tuhansilla" {- ade -}
-                                "tuhansilta" {- abl -} "tuhansille" {- all -}
-                                "tuhansitta" {- abe -} "tuhansine"  {- com -}
-                                "tuhansin"   {- instr -}
-                                "?"          {- other -}
-            )
-          ]
-
-ordinalRepr ∷ ( G.Singular i, G.Plural i
-              , G.Abessive i
-              , G.Accusative i
-              , G.Comitative i
-              , G.Delative i
-              , G.Distributive i
-              , G.DistributiveTemporal i
-              , G.Essive i
-              , G.Genitive i
-              , G.Instructive i
-              , G.Lative i
-              , G.LocativeInessive i
-              , G.LocativeElative i
-              , G.LocativeIllative i
-              , G.LocativeAdessive i
-              , G.LocativeAblative i
-              , G.LocativeAllative i
-              , G.Multiplicative i
-              , G.Nominative i
-              , G.Partitive i
-              , G.Sublative i
-              , G.SuperEssive i
-              , G.Translative i
-              )
-             ⇒ i → Exp i → Maybe Text
-ordinalRepr = render defaultRepr
-              { reprValue = \inf n → M.lookup n (syms inf)
-              , reprScale = BN.pelletierRepr
-                              (BN.quantityName "iljoona" "iljoonaa")
-                              (BN.quantityName "iljardi" "iljardia")
-                              []
-              , reprAdd   = Just $ \_ _ _ → ""
-              , reprMul   = Just $ \_ _ _ → ""
-              }
-    where
-      syms inf =
-          M.fromList
-          [ (0, \c → infForms inf c
-                              -- singular
-                              "nollas"      {- nom -} "nollas"      {- acc -}
-                              "nollannen"   {- gen -} "nollatta"    {- ptv -}
-                              "nollantena"  {- ess -} "nollanneksi" {- transl -}
-                              "nollannessa" {- ine -} "nollannesta" {- ela -}
-                              "nollanteen"  {- ill -} "nollannella" {- ade -}
-                              "nollannelta" {- abl -} "nollannelle" {- all -}
-                              "nollannetta" {- abe -}
-                              "?"           {- other -}
-                              -- plural
-                              "nollannet"   {- nom -} "nollannet"   {- acc -}
-                              "nollansien"  {- gen -} "nollansia"   {- ptv -}
-                              "nollansina"  {- ess -} "nollansiksi" {- transl -}
-                              "nollansissa" {- ine -} "nollansista" {- ela -}
-                              "nollansiin"  {- ill -} "nollansilla" {- ade -}
-                              "nollansilta" {- abl -} "nollansille" {- all -}
-                              "nollansitta" {- abe -} "nollansine"  {- com -}
-                              "nollansin"   {- instr -}
-                              "?"           {- other -}
-            )
-          , (1, \c → case c of
-                       CtxAdd _ (Lit 10) _ →
-                           infForms inf c
-                              -- singular
-                              "yhdes"      {- nom -} "yhdes"      {- acc -}
-                              "yhdennen"   {- gen -} "yhdettä"    {- ptv -}
-                              "yhdennessä" {- ess -} "yhdenneksi" {- transl -}
-                              "yhdennessä" {- ine -} "yhdennestä" {- ela -}
-                              "yhdenteen"  {- ill -} "yhdennellä" {- ade -}
-                              "yhdenneltä" {- abl -} "yhdennelle" {- all -}
-                              "yhdennettä" {- abe -}
-                              "?"          {- other -}
-                              -- plural
-                              "yhdennet"   {- nom -} "yhdennet"   {- acc -}
-                              "yhdensien"  {- gen -} "yhdensiä"   {- ptv -}
-                              "yhdensinä"  {- ess -} "yhdensiksi" {- transl -}
-                              "yhdensissä" {- ine -} "yhdensistä" {- ela -}
-                              "yhdensiin"  {- ill -} "yhdensillä" {- ade -}
-                              "yhdensitlä" {- abl -} "yhdensiin"  {- all -}
-                              "yhdensittä" {- abe -} "yhdensine"  {- com -}
-                              "yhdensin"   {- instr -}
-                              "?"          {- other -}
-                       _ → infForms inf c
-                              -- singular
-                              "ensimmäinen"   {- nom -} "ensimmäinen"   {- acc -}
-                              "ensimmäisen"   {- gen -} "ensimmäistä"   {- ptv -}
-                              "ensimmmäisenä" {- ess -} "ensimmäiseksi" {- transl -}
-                              "ensimmäisessä" {- ine -} "ensimmäisestä" {- ela -}
-                              "ensimmäiseen"  {- ill -} "ensimmäisellä" {- ade -}
-                              "ensimmäiseltä" {- abl -} "ensimmäiselle" {- all -}
-                              "ensimmäisettä" {- abe -}
-                              "?"             {- other -}
-                              -- plural
-                              "ensimmäiset"   {- nom -} "ensimmäiset"   {- acc -}
-                              "ensimmäisten"  {- gen -} "ensimmäisiä"   {- ptv -}
-                              "ensimmäisinä"  {- ess -} "ensimmäisiksi" {- transl -}
-                              "ensimmäisissä" {- ine -} "ensimmäisistä" {- ela -}
-                              "ensimmäisiin"  {- ill -} "ensimmäisillä" {- ade -}
-                              "ensimmäisiltä" {- abl -} "ensimmäisille" {- all -}
-                              "ensimmäisittä" {- abe -} "ensimmäisine"  {- com -}
-                              "ensimmäisin"   {- instr -}
-                              "?"             {- other -}
-            )
-          , (2, \c → case c of
-                       CtxAdd _ (Lit 10) _ →
-                           infForms inf c
-                              -- singular
-                              "kahdes"      {- nom -} "kahdes"      {- acc -}
-                              "kahdennen"   {- gen -} "kahdetta"    {- ptv -}
-                              "kahdentena"  {- ess -} "kahdenneksi" {- transl -}
-                              "kahdennessa" {- ine -} "kahdennesta" {- ela -}
-                              "kahdenteen"  {- ill -} "kahdennella" {- ade -}
-                              "kahdennelta" {- abl -} "kahdennelle" {- all -}
-                              "kahdennetta" {- abe -}
-                              "?"           {- other -}
-                              -- plural
-                              "kahdennet"   {- nom -} "kahdennet"   {- acc -}
-                              "kahdensien"  {- gen -} "kahdensia"   {- ptv -}
-                              "kahdensina"  {- ess -} "kahdensiksi" {- transl -}
-                              "kahdensissa" {- ine -} "kahdensista" {- ela -}
-                              "kahdensiin"  {- ill -} "kahdensilla" {- ade -}
-                              "kahdensilta" {- abl -} "kahdensille" {- all -}
-                              "kahdensitta" {- abe -} "kahdensine"  {- com -}
-                              "kahdensin"   {- instr -}
-                              "?"           {- other -}
-                       _ → infForms inf c
-                              -- singular
-                              "toinen"   {- nom -} "toinen"   {- acc -}
-                              "toisen"   {- gen -} "toista"   {- ptv -}
-                              "toisena"  {- ess -} "toiseksi" {- transl -}
-                              "toisessa" {- ine -} "toisesta" {- ela -}
-                              "toiseen"  {- ill -} "toisella" {- ade -}
-                              "toiselta" {- abl -} "toiselle" {- all -}
-                              "toisetta" {- abe -}
-                              "?"        {- other -}
-                              -- plural
-                              "toiset"   {- nom -} "toiset"   {- acc -}
-                              "toisten"  {- gen -} "toisia"   {- ptv -}
-                              "toisina"  {- ess -} "toisiksi" {- transl -}
-                              "toisissa" {- ine -} "toisista" {- ela -}
-                              "toisiin"  {- ill -} "toisilla" {- ade -}
-                              "toisilta" {- abl -} "toisille" {- all -}
-                              "toisitta" {- abe -} "toisine"  {- com -}
-                              "toisin"   {- instr -}
-                              "?"        {- other -}
-            )
-          , (3, \c → infForms inf c
-                              -- singular
-                              "kolmas"      {- nom -} "kolmas"      {- acc -}
-                              "kolmannen"   {- gen -} "kolmatta"    {- ptv -}
-                              "kolmantena"  {- ess -} "kolmanneksi" {- transl -}
-                              "kolmannessa" {- ine -} "kolmannesta" {- ela -}
-                              "kolmanteen"  {- ill -} "kolmannella" {- ade -}
-                              "kolmannelta" {- abl -} "kolmannelle" {- all -}
-                              "kolmannetta" {- abe -}
-                              "?"           {- other -}
-                              -- plural
-                              "kolmannet"   {- nom -} "kolmannet"   {- acc -}
-                              "kolmansien"  {- gen -} "kolmansia"   {- ptv -}
-                              "kolmansina"  {- ess -} "kolmansiksi" {- transl -}
-                              "kolmansissa" {- ine -} "kolmansista" {- ela -}
-                              "kolmansiin"  {- ill -} "kolmansilla" {- ade -}
-                              "kolmansilta" {- abl -} "kolmansille" {- all -}
-                              "kolmansitta" {- abe -} "kolmansine"  {- com -}
-                              "kolmansin"   {- instr -}
-                              "?"           {- other -}
-            )
-          , (4, \c → infForms inf c
-                              -- singular
-                              "neljäs"      {- nom -} "neljäs"      {- acc -}
-                              "neljännen"   {- gen -} "neljättä"    {- ptv -}
-                              "neljäntenä"  {- ess -} "neljänneksi" {- transl -}
-                              "neljännessä" {- ine -} "neljännestä" {- ela -}
-                              "neljänteen"  {- ill -} "neljännellä" {- ade -}
-                              "neljänneltä" {- abl -} "neljännelle" {- all -}
-                              "neljännettä" {- abe -}
-                              (case inf of
-                                 _ | G.isComitative  inf → "neljänsine"
-                                   | G.isInstructive inf → "neljänsin"
-                                   | otherwise → "?"
-                              )
-                              -- plural
-                              "neljännet"   {- nom -} "neljännet"   {- acc -}
-                              "neljänsien"  {- gen -} "neljänsiä"   {- ptv -}
-                              "neljänsinä"  {- ess -} "neljänsiksi" {- transl -}
-                              "neljänsissä" {- ine -} "neljänsistä" {- ela -}
-                              "neljänsiin"  {- ill -} "neljänsillä" {- ade -}
-                              "neljänsiltä" {- abl -} "neljänsille" {- all -}
-                              "neljänsittä" {- abe -} "neljänsine"  {- com -}
-                              "neljänsin"   {- instr -}
-                              "?"           {- other -}
-            )
-          , (5, \c → infForms inf c
-                              -- singular
-                              "viides"      {- nom -} "viides"      {- acc -}
-                              "viidennen"   {- gen -} "viidettä"    {- ptv -}
-                              "viidentenä"  {- ess -} "viidenneksi" {- transl -}
-                              "viidennessä" {- ine -} "viidennestä" {- ela -}
-                              "viidenteen"  {- ill -} "viidennellä" {- ade -}
-                              "viidenneltä" {- abl -} "viidennelle" {- all -}
-                              "viidennettä" {- abe -}
-                              "?"           {- other -}
-                              -- plural
-                              "viidennet"   {- nom -} "viidennet"   {- acc -}
-                              "viidensien"  {- gen -} "viidensiä"   {- ptv -}
-                              "viidensinä"  {- ess -} "viidensiksi" {- transl -}
-                              "viidensissä" {- ine -} "viidensistä" {- ela -}
-                              "viidensiin"  {- ill -} "viidensillä" {- ade -}
-                              "viidensiltä" {- abl -} "viidensille" {- all -}
-                              "viidensittä" {- abe -} "viidensine"  {- com -}
-                              "viidensin"   {- instr -}
-                              "?"           {- other -}
-            )
-          , (6, \c → infForms inf c
-                              -- singular
-                              "kuudes"      {- nom -} "kuudes"      {- acc -}
-                              "kuudennen"   {- gen -} "kuudetta"    {- ptv -}
-                              "kuudentena"  {- ess -} "kuudenneksi" {- transl -}
-                              "kuudennessa" {- ine -} "kuudennesta" {- ela -}
-                              "kuudenteen"  {- ill -} "kuudennella" {- ade -}
-                              "kuudennelta" {- abl -} "kuudennelle" {- all -}
-                              "kuudennetta" {- abe -}
-                              "?"           {- other -}
-                              -- plural
-                              "kuudennet"   {- nom -} "kuudennet"   {- acc -}
-                              "kuudensien"  {- gen -} "kuudensia"   {- ptv -}
-                              "kuudensina"  {- ess -} "kuudensiksi" {- transl -}
-                              "kuudensissa" {- ine -} "kuudensista" {- ela -}
-                              "kuudensiin"  {- ill -} "kuudensilla" {- ade -}
-                              "kuudensilta" {- abl -} "kuudensille" {- all -}
-                              "kuudensitta" {- abe -} "kuudensine"  {- com -}
-                              "kuudensin"   {- instr -}
-                              "?"           {- other -}
-            )
-          , (7, \c → infForms inf c
-                              -- singular
-                              "seitsemäs"      {- nom -} "seitsemäs"      {- acc -}
-                              "seitsemännen"   {- gen -} "seitsemättä"    {- ptv -}
-                              "seitsemäntenä"  {- ess -} "seitsemänneksi" {- transl -}
-                              "seitsemännessä" {- ine -} "seitsemännestä" {- ela -}
-                              "seitsemänteen"  {- ill -} "seitsemännellä" {- ade -}
-                              "seitsemänneltä" {- abl -} "seitsemännelle" {- all -}
-                              "seitsemännettä" {- abe -}
-                              "?"              {- other -}
-                              -- plural
-                              "seitsemännet"   {- nom -} "seitsemännet"   {- acc -}
-                              "seitsemänsien"  {- gen -} "seitsemänsiä"   {- ptv -}
-                              "seitsemänsinä"  {- ess -} "seitsemänsiksi" {- transl -}
-                              "seitsemänsissä" {- ine -} "seitsemänsistä" {- ela -}
-                              "seitsemänsiin"  {- ill -} "seitsemänsillä" {- ade -}
-                              "seitsemänsiltä" {- abl -} "seitsemänsille" {- all -}
-                              "seitsemänsittä" {- abe -} "seitsemänsine"  {- com -}
-                              "seitsemänsin"   {- instr -}
-                              "?"              {- other -}
-            )
-          , (8, \c → infForms inf c
-                              -- singular
-                              "kahdeksas"      {- nom -} "kahdeksas"      {- acc -}
-                              "kahdeksannen"   {- gen -} "kahdeksatta"    {- ptv -}
-                              "kahdeksantena"  {- ess -} "kahdeksanneksi" {- transl -}
-                              "kahdeksannessa" {- ine -} "kahdeksannesta" {- ela -}
-                              "kahdeksanteen"  {- ill -} "kahdeksannella" {- ade -}
-                              "kahdeksannelta" {- abl -} "kahdeksannelle" {- all -}
-                              "kahdeksannetta" {- abe -}
-                              "?"              {- other -}
-                              -- plural
-                              "kahdeksannet"   {- nom -} "kahdeksannet"   {- acc -}
-                              "kahdeksansien"  {- gen -} "kahdeksansia"   {- ptv -}
-                              "kahdeksansina"  {- ess -} "kahdeksansiksi" {- transl -}
-                              "kahdeksansissa" {- ine -} "kahdeksansista" {- ela -}
-                              "kahdeksansiin"  {- ill -} "kahdeksansilla" {- ade -}
-                              "kahdeksansilta" {- abl -} "kahdeksansille" {- all -}
-                              "kahdeksansitta" {- abe -} "kahdeksansine"  {- com -}
-                              "kahdeksansin"   {- instr -}
-                              "?"              {- other -}
-            )
-          , (9, \c → infForms inf c
-                              -- singular
-                              "yhdeksäs"      {- nom -} "yhdeksäs"      {- acc -}
-                              "yhdeksännen"   {- gen -} "yhdeksättä"    {- ptv -}
-                              "yhdeksäntenä"  {- ess -} "yhdeksänneksi" {- transl -}
-                              "yhdeksännessä" {- ine -} "yhdeksännestä" {- ela -}
-                              "yhdeksänteen"  {- ill -} "yhdeksännellä" {- ade -}
-                              "yhdeksänneltä" {- abl -} "yhdeksännelle" {- all -}
-                              "yhdeksännettä" {- abe -}
-                              "?"             {- other -}
-                              -- plural
-                              "yhdeksännet"   {- nom -} "yhdeksännet"   {- acc -}
-                              "yhdeksänsien"  {- gen -} "yhdeksänsiä"   {- ptv -}
-                              "yhdeksänsinä"  {- ess -} "yhdeksänsiksi" {- transl -}
-                              "yhdeksänsissä" {- ine -} "yhdeksänsistä" {- ela -}
-                              "yhdeksänsiin"  {- ill -} "yhdeksänsillä" {- ade -}
-                              "yhdeksänsiltä" {- abl -} "yhdeksänsille" {- all -}
-                              "yhdeksänsittä" {- abe -} "yhdeksänsine"  {- com -}
-                              "yhdeksänsin"   {- instr -}
-                              "?"             {- other -}
-            )
-          , (10, \c → case c of
-                        CtxAdd _ (Lit _) _ → "toista" -- singular partitive ordinal 2
-                        _ → infForms inf c
-                                 -- singular
-                                 "kymmenes"      {- nom -} "kymmenes"      {- acc -}
-                                 "kymmenennen"   {- gen -} "kymmenettä"    {- ptv -}
-                                 "kymmenentenä"  {- ess -} "kymmenenneksi" {- transl -}
-                                 "kymmenennessä" {- ine -} "kymmenennestä" {- ela -}
-                                 "kymmenenteen"  {- ill -} "kymmenennellä" {- ade -}
-                                 "kymmenenneltä" {- abl -} "kymmenennelle" {- all -}
-                                 "kymmenennettä" {- abe -}
-                                 "?"             {- other -}
-                                 -- plural
-                                 "kymmenennet"   {- nom -} "kymmenennet"   {- acc -}
-                                 "kymmenensien"  {- gen -} "kymmenensiä"   {- ptv -}
-                                 "kymmenensinä"  {- ess -} "kymmenensiksi" {- transl -}
-                                 "kymmenensissä" {- ine -} "kymmenensistä" {- ela -}
-                                 "kymmenensiin"  {- ill -} "kymmenensillä" {- ade -}
-                                 "kymmenensiltä" {- abl -} "kymmenensille" {- all -}
-                                 "kymmenensittä" {- abe -} "kymmenensine"  {- com -}
-                                 "kymmenensin"   {- instr -}
-                                 "?"             {- other -}
-            )
-          , (100, \c → case c of
-                         _ → infForms inf c
-                               -- singular
-                               "sadas"      {- nom -} "sadas"      {- acc -}
-                               "sadannen"   {- gen -} "sadatta"    {- ptv -}
-                               "sadantena"  {- ess -} "sadanneksi" {- transl -}
-                               "sadannessa" {- ine -} "sadannesta" {- ela -}
-                               "sadanteen"  {- ill -} "sadannella" {- ade -}
-                               "sadannelta" {- abl -} "sadannelle" {- all -}
-                               "sadannetta" {- abe -}
-                               "?"          {- other -}
-                               -- plural
-                               "sadannet"   {- nom -} "sadannet"   {- acc -}
-                               "sadansien"  {- gen -} "sadansia"   {- ptv -}
-                               "sadansina"  {- ess -} "sadansiksi" {- transl -}
-                               "sadansissa" {- ine -} "sadansista" {- ela -}
-                               "sadansiin"  {- ill -} "sadansilla" {- ade -}
-                               "sadansilta" {- abl -} "sadansille" {- all -}
-                               "sadansitta" {- abe -} "sadansine"  {- com -}
-                               "sadansin"   {- instr -}
-                               "?"          {- other -}
-            )
-          , (1000, \c → case c of
-                         _ → infForms inf c
-                               -- singular
-                               "tuhannes"      {- nom -} "tuhannes"      {- acc -}
-                               "tuhannennen"   {- gen -} "tuhannetta"    {- ptv -}
-                               "tuhannentena"  {- ess -} "tuhannenneksi" {- transl -}
-                               "tuhannennessa" {- ine -} "tuhannennesta" {- ela -}
-                               "tuhannenteen"  {- ill -} "tuhannennella" {- ade -}
-                               "tuhannennelta" {- abl -} "tuhannennelle" {- all -}
-                               "tuhannennetta" {- abe -}
-                               "?"             {- other -}
-                               -- plural
-                               "tuhannennet"   {- nom -} "tuhannennet"   {- acc -}
-                               "tuhannensien"  {- gen -} "tuhannensia"   {- ptv -}
-                               "tuhannensina"  {- ess -} "tuhannensiksi" {- transl -}
-                               "tuhannensissa" {- ine -} "tuhannensista" {- ela -}
-                               "tuhannensiin"  {- ill -} "tuhannensilla" {- ade -}
-                               "tuhannensilta" {- abl -} "tuhannensille" {- all -}
-                               "tuhannensitta" {- abe -} "tuhannensine"  {- com -}
-                               "tuhannensin"   {- instr -}
-                               "?"             {- other -}
-            )
-          ]
-
-infForms ∷ ( G.Singular i, G.Plural i
-           , G.Abessive i
-           , G.Accusative i
-           , G.Comitative i
-           , G.Delative i
-           , G.Distributive i
-           , G.DistributiveTemporal i
-           , G.Essive i
-           , G.Genitive i
-           , G.Instructive i
-           , G.Lative i
-           , G.LocativeInessive i
-           , G.LocativeElative i
-           , G.LocativeIllative i
-           , G.LocativeAdessive i
-           , G.LocativeAblative i
-           , G.LocativeAllative i
-           , G.Multiplicative i
-           , G.Nominative i
-           , G.Partitive i
-           , G.Sublative i
-           , G.SuperEssive i
-           , G.Translative i
-           )
-         ⇒ i → Ctx (Exp i)
-         → Text → Text → Text → Text → Text → Text → Text → Text → Text → Text
-         → Text → Text → Text → Text → Text → Text → Text → Text → Text → Text
-         → Text → Text → Text → Text → Text → Text → Text → Text → Text → Text → Text
-infForms inf _
-         s_nom s_acc s_gen s_ptv s_ess s_transl
-         s_ine s_ela s_ill s_ade s_abl s_all s_abe
-         s_other
-         p_nom p_acc p_gen p_ptv p_ess p_transl
-         p_ine p_ela p_ill p_ade p_abl p_all p_abe p_com p_instr
-         p_other
-    | G.isSingular inf = singularForms
-    | G.isPlural   inf = pluralForms
-    | otherwise        = "?"
-  where
-    singularForms
-        | G.isNominative       inf = s_nom
-        | G.isAccusative       inf = s_acc
-        | G.isGenitive         inf = s_gen
-        | G.isPartitive        inf = s_ptv
-        | G.isEssive           inf = s_ess
-        | G.isTranslative      inf = s_transl
-        | G.isLocativeInessive inf = s_ine
-        | G.isLocativeElative  inf = s_ela
-        | G.isLocativeIllative inf = s_ill
-        | G.isLocativeAdessive inf = s_ade
-        | G.isLocativeAblative inf = s_abl
-        | G.isLocativeAllative inf = s_all
-        | G.isAbessive         inf = s_abe
-        | otherwise                = s_other
-    pluralForms
-        | G.isNominative       inf = p_nom
-        | G.isAccusative       inf = p_acc
-        | G.isGenitive         inf = p_gen
-        | G.isPartitive        inf = p_ptv
-        | G.isEssive           inf = p_ess
-        | G.isTranslative      inf = p_transl
-        | G.isLocativeInessive inf = p_ine
-        | G.isLocativeElative  inf = p_ela
-        | G.isLocativeIllative inf = p_ill
-        | G.isLocativeAdessive inf = p_ade
-        | G.isLocativeAblative inf = p_abl
-        | G.isLocativeAllative inf = p_all
-        | G.isAbessive         inf = p_abe
-        | G.isComitative       inf = p_com
-        | G.isInstructive      inf = p_instr
-        | otherwise                = p_other
diff --git a/src/Text/Numeral/Language/FIN.hs b/src/Text/Numeral/Language/FIN.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/FIN.hs
@@ -0,0 +1,808 @@
+{-|
+[@ISO639-1@]        fi
+
+[@ISO639-2B@]       fin
+
+[@ISO639-3@]        fin
+
+[@Native name@]     suomi
+
+[@English name@]    Finnish
+-}
+
+module Text.Numeral.Language.FIN
+    ( -- * Language entry
+      entry
+      -- * Inflection
+    , Inflection
+      -- * Conversions
+    , cardinal
+    , ordinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum  as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- FIN
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "fi"
+    , entIso639_2    = ["fin"]
+    , entIso639_3    = Just "fin"
+    , entNativeNames = ["suomi"]
+    , entEnglishName = Just "Finnish"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    , entOrdinal     = Just Conversion
+                       { toNumeral   = ordinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+ordinal inf = ordinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = fix $ rule `combine` pelletierScale R L BN.rule
+    where
+      rule = findRule (   0, lit)
+                    [ (  11, add 10 L)
+                    , (  20, fi_mul 10)
+                    , ( 100, step  100   10 R L)
+                    , (1000, step 1000 1000 R L)
+                    ]
+                      (dec 6 - 1)
+
+-- | Like the normal 'mul' rule with the difference that the value
+-- that is multiplied is changed to the partitive case.
+fi_mul :: (Integral a) => a -> Rule a
+fi_mul val =
+    \f n -> let (m, a) = n `divMod` val
+                mval = Mul (f m) (ChangeCase (Just Partitive) $ f val)
+            in if a == 0
+               then mval
+               else (flip Add) (f a) mval
+  -- where
+  --   toPartitive :: Inflection -> Inflection
+  --   toPartitive inf | G.isSingular inf && (G.isNominative inf || G.isAccusative inf) = G.partitive inf
+  --                   | otherwise = inf
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 15 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \inf n -> M.lookup n (syms inf)
+               , reprScale = BN.pelletierRepr
+                               (BN.quantityName "iljoona" "iljoonaa")
+                               (BN.quantityName "iljardi" "iljardia")
+                               []
+               , reprAdd   = Just $ \_ _ _ -> ""
+               , reprMul   = Just $ \_ _ _ -> ""
+               }
+    where
+      syms inf =
+          M.fromList
+          [ (0, \c -> infForms inf c
+                              -- singular
+                              "nolla"    {- nom -} "nolla"    {- acc -}
+                              "nollan"   {- gen -} "nollaa"   {- ptv -}
+                              "nollana"  {- ess -} "nollaksi" {- transl -}
+                              "nollassa" {- ine -} "nollasta" {- ela -}
+                              "nollaan"  {- ill -} "nollalla" {- ade -}
+                              "nollalta" {- abl -} "nollalle" {- all -}
+                              "nollatta" {- abe -}
+                              "?"        {- other -}
+                              -- plural
+                              "nollat"   {- nom -} "nollat"   {- acc -}
+                              "nollien"  {- gen -} "nollia"   {- ptv -}
+                              "nollina"  {- ess -} "nolliksi" {- transl -}
+                              "nollissa" {- ine -} "nollista" {- ela -}
+                              "nolliin"  {- ill -} "nollilla" {- ade -}
+                              "nollilta" {- abl -} "nollille" {- all -}
+                              "nollitta" {- abe -} "nolline"  {- com -}
+                              "nollin"   {- instr -}
+                              "?"        {- other -}
+            )
+         , (1, \c -> infForms inf c
+                             -- singular
+                             "yksi"     {- nom -} "yksi"     {- acc -}
+                             "yhden"    {- gen -} "yhtä"     {- ptv -}
+                             "yhtenä"   {- ess -} "yhdeksi"  {- transl -}
+                             "yhdessä"  {- ine -} "yhdestä"  {- ela -}
+                             "yhteen"   {- ill -} "yhdellä"  {- ade -}
+                             "yhdeltä"  {- abl -} "yhdelle"  {- all -}
+                             "yhdettä"  {- abe -}
+                             (case inf of
+                                _ | isSuperEssive    inf -> "yhtäällä"
+                                  | isDelative       inf -> "yhtäältä"
+                                  | isSublative      inf -> "yhtäälle"
+                                  | isLative         inf -> "yhä"
+                                  | isMultiplicative inf -> "yhdesti"
+                                  | otherwise            -> "?"
+                             )
+                             -- plural
+                             "yhdet"    {- nom -} "yhdet"    {- acc -}
+                             "yksien"   {- gen -} "yksiä"    {- ptv -}
+                             "yksinä"   {- ess -} "yksiksi"  {- transl -}
+                             "yksissä"  {- ine -} "yksistä"  {- ela -}
+                             "yksiin"   {- ill -} "yksillä"  {- ade -}
+                             "yksiltä"  {- abl -} "yksille"  {- all -}
+                             "yksittä"  {- abe -} "yksine"   {- com -}
+                             "yksin"    {- instr -}
+                             (case inf of
+                                _ | isDistributive inf -> "yksittäin"
+                                  | otherwise          -> "?"
+                             )
+           )
+          , (2, \c -> infForms inf c
+                              -- singular
+                              "kaksi"    {- nom -} "kaksi"    {- acc -}
+                              "kahden"   {- gen -} "kahta"    {- ptv -}
+                              "kahtena"  {- ess -} "kahdeksi" {- transl -}
+                              "kahdessa" {- ine -} "kahdesta" {- ela -}
+                              "kahteen"  {- ill -} "kahdella" {- ade -}
+                              "kahdelta" {- abl -} "kahdelle" {- all -}
+                              "kahdetta" {- abe -}
+                              (case inf of
+                                 _ | isInstructive    inf -> "kahden"
+                                   | isSuperEssive    inf -> "kahtaalla"
+                                   | isDelative       inf -> "kahtaalta"
+                                   | isSublative      inf -> "kahtaalle"
+                                   | isLative         inf -> "kahtia"
+                                   | isMultiplicative inf -> "kahdesti"
+                                   | otherwise            -> "?"
+                              )
+                              -- plural
+                              "kahdet"   {- nom -} "kahdet"   {- acc -}
+                              "kaksien"  {- gen -} "kaksia"   {- ptv -}
+                              "kaksina"  {- ess -} "kaksiksi" {- transl -}
+                              "kaksissa" {- ine -} "kaksista" {- ela -}
+                              "kaksiin"  {- ill -} "kaksilla" {- ade -}
+                              "kaksilta" {- abl -} "kaksille" {- all -}
+                              "kaksitta" {- abe -} "kaksine"  {- com -}
+                              "kaksin"   {- instr -}
+                              (case inf of
+                                 _ | isDistributive inf -> "kaksittain"
+                                   | otherwise          -> "?"
+                              )
+            )
+          , (3, \c -> infForms inf c
+                              -- singular
+                              "kolme"    {- nom -} "kolme"    {- acc -}
+                              "kolmen"   {- gen -} "kolmea"   {- ptv -}
+                              "kolmena"  {- ess -} "kolmeksi" {- transl -}
+                              "kolmessa" {- ine -} "kolmesta" {- ela -}
+                              "kolmeen"  {- ill -} "kolmella" {- ade -}
+                              "kolmelta" {- abl -} "kolmelle" {- all -}
+                              "kolmetta" {- abe -}
+                              (case inf of
+                                 _ | isInstructive    inf -> "kolmen"
+                                   | isLative         inf -> "kolmia"
+                                   | isMultiplicative inf -> "kolmesti"
+                                   | otherwise            -> "?"
+                              )
+                              -- plural
+                              "kolmet"   {- nom -} "kolmet"   {- acc -}
+                              "kolmien"  {- gen -} "kolmia"   {- ptv -}
+                              "kolmina"  {- ess -} "kolmiksi" {- transl -}
+                              "kolmissa" {- ine -} "kolmista" {- ela -}
+                              "kolmiin"  {- ill -} "kolmilla" {- ade -}
+                              "kolmilta" {- abl -} "kolmille" {- all -}
+                              "kolmitta" {- abe -} "kolmine"  {- com -}
+                              "kolmin"   {- instr -}
+                              (case inf of
+                                 _ | isDistributive         inf -> "kolmittain"
+                                   | isDistributiveTemporal inf -> "kolmisin"
+                                   | otherwise                  -> "?"
+                              )
+            )
+          , (4, \c -> infForms inf c
+                              -- singular
+                              "neljä"    {- nom -} "neljä"    {- acc -}
+                              "neljän"   {- gen -} "neljää"   {- ptv -}
+                              "neljänä"  {- ess -} "neljäksi" {- transl -}
+                              "neljässä" {- ine -} "neljästä" {- ela -}
+                              "neljään"  {- ill -} "neljällä" {- ade -}
+                              "neljältä" {- abl -} "neljälle" {- all -}
+                              "neljättä" {- abe -}
+                              "?"        {- other -}
+                              -- plural
+                              "neljät"   {- nom -} "neljät"   {- acc -}
+                              "neljien"  {- gen -} "neljiä"   {- ptv -}
+                              "neljinä"  {- ess -} "neljiksi" {- transl -}
+                              "neljissä" {- ine -} "neljistä" {- ela -}
+                              "neljiin"  {- ill -} "neljillä" {- ade -}
+                              "neljiltä" {- abl -} "neljille" {- all -}
+                              "neljittä" {- abe -} "neljine"  {- com -}
+                              "neljin"   {- instr -}
+                              "?"        {- other -}
+            )
+          , (5, \c -> infForms inf c
+                              -- singular
+                              "viisi"    {- nom -} "viisi"    {- acc -}
+                              "viiden"   {- gen -} "viittä"   {- ptv -}
+                              "viitenä"  {- ess -} "viideksi" {- transl -}
+                              "viidessä" {- ine -} "viidestä" {- ela -}
+                              "viiteen"  {- ill -} "viidellä" {- ade -}
+                              "viideltä" {- abl -} "viidelle" {- all -}
+                              "viidettä" {- abe -}
+                              "?"        {- other -}
+                              -- plural
+                              "viidet"   {- nom -} "viidet"   {- acc -}
+                              "viisien"  {- gen -} "viisiä"   {- ptv -}
+                              "viisinä"  {- ess -} "viisiksi" {- transl -}
+                              "viisissä" {- ine -} "viisistä" {- ela -}
+                              "viisiin"  {- ill -} "viisillä" {- ade -}
+                              "viisiltä" {- abl -} "viisille" {- all -}
+                              "viisittä" {- abe -} "viisine"  {- com -}
+                              "viisin"   {- instr -}
+                              "?"        {- other -}
+            )
+          , (6, \c -> infForms inf c
+                              -- singular
+                              "kuusi"    {- nom -} "kuusi"    {- acc -}
+                              "kuuden"   {- gen -} "kuutta"   {- ptv -}
+                              "kuutena"  {- ess -} "kuudeksi" {- transl -}
+                              "kuudessa" {- ine -} "kuudesta" {- ela -}
+                              "kuuteen"  {- ill -} "kuudella" {- ade -}
+                              "kuudelta" {- abl -} "kuudelle" {- all -}
+                              "kuudetta" {- abe -}
+                              "?"        {- other -}
+                              -- plural
+                              "kuudet"   {- nom -} "kuudet"   {- acc -}
+                              "kuusien"  {- gen -} "kuusia"   {- ptv -}
+                              "kuusina"  {- ess -} "kuusiksi" {- transl -}
+                              "kuusissa" {- ine -} "kuusista" {- ela -}
+                              "kuusiin"  {- ill -} "kuusilla" {- ade -}
+                              "kuusilta" {- abl -} "kuusille" {- all -}
+                              "kuusitta" {- abe -} "kuusine"  {- com -}
+                              "kuusin"   {- instr -}
+                              "?"        {- other -}
+            )
+          , (7, \c -> infForms inf c
+                              -- singular
+                              "seitsemän"   {- nom -} "seitsemän"   {- acc -}
+                              "seitsemän"   {- gen -} "seitsemää"   {- ptv -}
+                              "seitsemänä"  {- ess -} "seitsemäksi" {- transl -}
+                              "seitsemässä" {- ine -} "seitsemästä" {- ela -}
+                              "seitsemään"  {- ill -} "seitsemällä" {- ade -}
+                              "seitsemältä" {- abl -} "seitsemälle" {- all -}
+                              "seitsemättä" {- abe -}
+                              "?"           {- other -}
+                              -- plural
+                              "seitsemät"   {- nom -} "seitsemät"   {- acc -}
+                              "seitsemien"  {- gen -} "seitsemiä"   {- ptv -}
+                              "seitseminä"  {- ess -} "seitsemiksi" {- transl -}
+                              "seitsemissä" {- ine -} "seitsemistä" {- ela -}
+                              "seitsemiin"  {- ill -} "seitsemillä" {- ade -}
+                              "seitsemiltä" {- abl -} "seitsemille" {- all -}
+                              "seitsemittä" {- abe -} "seitsemine"  {- com -}
+                              "seitsemin"   {- instr -}
+                              "?"           {- other -}
+            )
+          , (8, \c -> infForms inf c
+                              -- singular
+                              "kahdeksan"   {- nom -} "kahdeksan"   {- acc -}
+                              "kahdeksan"   {- gen -} "kahdeksaa"   {- ptv -}
+                              "kahdeksana"  {- ess -} "kahdeksaksi" {- transl -}
+                              "kahdeksassa" {- ine -} "kahdeksasta" {- ela -}
+                              "kahdeksaan"  {- ill -} "kahdeksalla" {- ade -}
+                              "kahdeksalta" {- abl -} "kahdeksalle" {- all -}
+                              "kahdeksatta" {- abe -}
+                              "?"           {- other -}
+                              -- plural
+                              "kahdeksat"   {- nom -} "kahdeksat"   {- acc -}
+                              "kahdeksien"  {- gen -} "kahdeksia"   {- ptv -}
+                              "kahdeksina"  {- ess -} "kahdeksiksi" {- transl -}
+                              "kahdeksissa" {- ine -} "kahdeksista" {- ela -}
+                              "kahdeksiin"  {- ill -} "kahdeksilla" {- ade -}
+                              "kahdeksilta" {- abl -} "kahdeksille" {- all -}
+                              "kahdeksitta" {- abe -} "kahdeksine"  {- com -}
+                              "kahdeksin"   {- instr -}
+                              "?"           {- other -}
+            )
+          , (9, \c -> infForms inf c
+                              -- singular
+                              "yhdeksän"   {- nom -} "yhdeksän"   {- acc -}
+                              "yhdeksän"   {- gen -} "yhdeksää"   {- ptv -}
+                              "yhdeksänä"  {- ess -} "yhdeksäksi" {- transl -}
+                              "yhdeksässä" {- ine -} "yhdeksästä" {- ela -}
+                              "yhdeksään"  {- ill -} "yhdeksällä" {- ade -}
+                              "yhdeksältä" {- abl -} "yhdeksälle" {- all -}
+                              "yhdeksättä" {- abe -}
+                              "?"          {- other -}
+                              -- plural
+                              "yhdeksät"   {- nom -} "yhdeksät"   {- acc -}
+                              "yhdeksien"  {- gen -} "yhdeksiä"   {- ptv -}
+                              "yhdeksinä"  {- ess -} "yhdeksiksi" {- transl -}
+                              "yhdeksissä" {- ine -} "yhdeksistä" {- ela -}
+                              "yhdeksiin"  {- ill -} "yhdeksillä" {- ade -}
+                              "yhdeksiltä" {- abl -} "yhdeksille" {- all -}
+                              "yhdeksittä" {- abe -} "yhdeksine"  {- com -}
+                              "yhdeksin"   {- instr -}
+                              "?"          {- other -}
+            )
+
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit _) _ -> "toista" -- singular partitive ordinal 2
+                        _ -> infForms inf c
+                              -- singular
+                              "kymmenen"   {- nom -} "kymmenen"   {- acc -}
+                              "kymmenen"   {- gen -} "kymmentä"   {- ptv -}
+                              "kymmenenä"  {- ess -} "kymmeneksi" {- transl -}
+                              "kymmenessä" {- ine -} "kymmenestä" {- ela -}
+                              "kymmeneen"  {- ill -} "kymmenellä" {- ade -}
+                              "kymmeneltä" {- abl -} "kymmenelle" {- all -}
+                              "kymmenettä" {- abe -}
+                              "?"          {- other -}
+                              -- plural
+                              "kymmenet"   {- nom -} "kymmenet"   {- acc -}
+                              "kymmenien"  {- gen -} "kymmeniä"   {- ptv -}
+                              "kymmeninä"  {- ess -} "kymmeniksi" {- transl -}
+                              "kymmenissä" {- ine -} "kymmenistä" {- ela -}
+                              "kymmeniin"  {- ill -} "kymmenillä" {- ade -}
+                              "kymmeniltä" {- abl -} "kymmenille" {- all -}
+                              "kymmenittä" {- abe -} "kymmenine"  {- com -}
+                              "kymmenin"   {- instr -}
+                              "?"          {- other -}
+            )
+          , (100, \c -> case c of
+                         CtxMul _ (Lit n) _
+                             | n <= 9 -> "sataa"
+                         _ -> infForms inf c
+                               -- singular
+                               "sata"    {- nom -} "sata"    {- acc -}
+                               "sadan"   {- gen -} "sataa"   {- ptv -}
+                               "satana"  {- ess -} "sadaksi" {- transl -}
+                               "sadassa" {- ine -} "sadasta" {- ela -}
+                               "sataan"  {- ill -} "sadalla" {- ade -}
+                               "sadalta" {- abl -} "sadalle" {- all -}
+                               "sadatta" {- abe -}
+                               "?"       {- other -}
+                               -- plural
+                               "sadat"    {- nom -} "sadat"    {- acc -}
+                               "satojen"  {- gen -} "satoja"   {- ptv -}
+                               "satoina"  {- ess -} "sadoiksi" {- transl -}
+                               "sadoissa" {- ine -} "sadoista" {- ela -}
+                               "satoihin" {- ill -} "sadoilla" {- ade -}
+                               "sadoilta" {- abl -} "sadoille" {- all -}
+                               "sadoitta" {- abe -} "satoine"  {- com -}
+                               "sadoin"   {- instr -}
+                               "?"        {- other -}
+            )
+          , (1000, \c -> case c of
+                          CtxMul {} -> "tuhatta"
+                          _ -> infForms inf c
+                                -- singular
+                                "tuhat"      {- nom -} "tuhat"      {- acc -}
+                                "tuhannen"   {- gen -} "tuhatta"    {- ptv -}
+                                "tuhantena"  {- ess -} "tuhanneksi" {- transl -}
+                                "tuhannessa" {- ine -} "tuhannesta" {- ela -}
+                                "tuhanteen"  {- ill -} "tuhannella" {- ade -}
+                                "tuhannelta" {- abl -} "tuhannelle" {- all -}
+                                "tuhannetta" {- abe -}
+                                "?"          {- other -}
+                                -- plural
+                                "tuhannet"   {- nom -} "tuhannet"   {- acc -}
+                                "tuhansien"  {- gen -} "tuhansia"   {- ptv -}
+                                "tuhansina"  {- ess -} "tuhansiksi" {- transl -}
+                                "tuhansissa" {- ine -} "tuhansista" {- ela -}
+                                "tuhansiin"  {- ill -} "tuhansilla" {- ade -}
+                                "tuhansilta" {- abl -} "tuhansille" {- all -}
+                                "tuhansitta" {- abe -} "tuhansine"  {- com -}
+                                "tuhansin"   {- instr -}
+                                "?"          {- other -}
+            )
+          ]
+
+ordinalRepr :: Inflection -> Exp -> Maybe Text
+ordinalRepr = render defaultRepr
+              { reprValue = \inf n -> M.lookup n (syms inf)
+              , reprScale = BN.pelletierRepr
+                              (BN.quantityName "iljoona" "iljoonaa")
+                              (BN.quantityName "iljardi" "iljardia")
+                              []
+              , reprAdd   = Just $ \_ _ _ -> ""
+              , reprMul   = Just $ \_ _ _ -> ""
+              }
+    where
+      syms inf =
+          M.fromList
+          [ (0, \c -> infForms inf c
+                              -- singular
+                              "nollas"      {- nom -} "nollas"      {- acc -}
+                              "nollannen"   {- gen -} "nollatta"    {- ptv -}
+                              "nollantena"  {- ess -} "nollanneksi" {- transl -}
+                              "nollannessa" {- ine -} "nollannesta" {- ela -}
+                              "nollanteen"  {- ill -} "nollannella" {- ade -}
+                              "nollannelta" {- abl -} "nollannelle" {- all -}
+                              "nollannetta" {- abe -}
+                              "?"           {- other -}
+                              -- plural
+                              "nollannet"   {- nom -} "nollannet"   {- acc -}
+                              "nollansien"  {- gen -} "nollansia"   {- ptv -}
+                              "nollansina"  {- ess -} "nollansiksi" {- transl -}
+                              "nollansissa" {- ine -} "nollansista" {- ela -}
+                              "nollansiin"  {- ill -} "nollansilla" {- ade -}
+                              "nollansilta" {- abl -} "nollansille" {- all -}
+                              "nollansitta" {- abe -} "nollansine"  {- com -}
+                              "nollansin"   {- instr -}
+                              "?"           {- other -}
+            )
+          , (1, \c -> case c of
+                       CtxAdd _ (Lit 10) _ ->
+                           infForms inf c
+                              -- singular
+                              "yhdes"      {- nom -} "yhdes"      {- acc -}
+                              "yhdennen"   {- gen -} "yhdettä"    {- ptv -}
+                              "yhdennessä" {- ess -} "yhdenneksi" {- transl -}
+                              "yhdennessä" {- ine -} "yhdennestä" {- ela -}
+                              "yhdenteen"  {- ill -} "yhdennellä" {- ade -}
+                              "yhdenneltä" {- abl -} "yhdennelle" {- all -}
+                              "yhdennettä" {- abe -}
+                              "?"          {- other -}
+                              -- plural
+                              "yhdennet"   {- nom -} "yhdennet"   {- acc -}
+                              "yhdensien"  {- gen -} "yhdensiä"   {- ptv -}
+                              "yhdensinä"  {- ess -} "yhdensiksi" {- transl -}
+                              "yhdensissä" {- ine -} "yhdensistä" {- ela -}
+                              "yhdensiin"  {- ill -} "yhdensillä" {- ade -}
+                              "yhdensitlä" {- abl -} "yhdensiin"  {- all -}
+                              "yhdensittä" {- abe -} "yhdensine"  {- com -}
+                              "yhdensin"   {- instr -}
+                              "?"          {- other -}
+                       _ -> infForms inf c
+                              -- singular
+                              "ensimmäinen"   {- nom -} "ensimmäinen"   {- acc -}
+                              "ensimmäisen"   {- gen -} "ensimmäistä"   {- ptv -}
+                              "ensimmmäisenä" {- ess -} "ensimmäiseksi" {- transl -}
+                              "ensimmäisessä" {- ine -} "ensimmäisestä" {- ela -}
+                              "ensimmäiseen"  {- ill -} "ensimmäisellä" {- ade -}
+                              "ensimmäiseltä" {- abl -} "ensimmäiselle" {- all -}
+                              "ensimmäisettä" {- abe -}
+                              "?"             {- other -}
+                              -- plural
+                              "ensimmäiset"   {- nom -} "ensimmäiset"   {- acc -}
+                              "ensimmäisten"  {- gen -} "ensimmäisiä"   {- ptv -}
+                              "ensimmäisinä"  {- ess -} "ensimmäisiksi" {- transl -}
+                              "ensimmäisissä" {- ine -} "ensimmäisistä" {- ela -}
+                              "ensimmäisiin"  {- ill -} "ensimmäisillä" {- ade -}
+                              "ensimmäisiltä" {- abl -} "ensimmäisille" {- all -}
+                              "ensimmäisittä" {- abe -} "ensimmäisine"  {- com -}
+                              "ensimmäisin"   {- instr -}
+                              "?"             {- other -}
+            )
+          , (2, \c -> case c of
+                       CtxAdd _ (Lit 10) _ ->
+                           infForms inf c
+                              -- singular
+                              "kahdes"      {- nom -} "kahdes"      {- acc -}
+                              "kahdennen"   {- gen -} "kahdetta"    {- ptv -}
+                              "kahdentena"  {- ess -} "kahdenneksi" {- transl -}
+                              "kahdennessa" {- ine -} "kahdennesta" {- ela -}
+                              "kahdenteen"  {- ill -} "kahdennella" {- ade -}
+                              "kahdennelta" {- abl -} "kahdennelle" {- all -}
+                              "kahdennetta" {- abe -}
+                              "?"           {- other -}
+                              -- plural
+                              "kahdennet"   {- nom -} "kahdennet"   {- acc -}
+                              "kahdensien"  {- gen -} "kahdensia"   {- ptv -}
+                              "kahdensina"  {- ess -} "kahdensiksi" {- transl -}
+                              "kahdensissa" {- ine -} "kahdensista" {- ela -}
+                              "kahdensiin"  {- ill -} "kahdensilla" {- ade -}
+                              "kahdensilta" {- abl -} "kahdensille" {- all -}
+                              "kahdensitta" {- abe -} "kahdensine"  {- com -}
+                              "kahdensin"   {- instr -}
+                              "?"           {- other -}
+                       _ -> infForms inf c
+                              -- singular
+                              "toinen"   {- nom -} "toinen"   {- acc -}
+                              "toisen"   {- gen -} "toista"   {- ptv -}
+                              "toisena"  {- ess -} "toiseksi" {- transl -}
+                              "toisessa" {- ine -} "toisesta" {- ela -}
+                              "toiseen"  {- ill -} "toisella" {- ade -}
+                              "toiselta" {- abl -} "toiselle" {- all -}
+                              "toisetta" {- abe -}
+                              "?"        {- other -}
+                              -- plural
+                              "toiset"   {- nom -} "toiset"   {- acc -}
+                              "toisten"  {- gen -} "toisia"   {- ptv -}
+                              "toisina"  {- ess -} "toisiksi" {- transl -}
+                              "toisissa" {- ine -} "toisista" {- ela -}
+                              "toisiin"  {- ill -} "toisilla" {- ade -}
+                              "toisilta" {- abl -} "toisille" {- all -}
+                              "toisitta" {- abe -} "toisine"  {- com -}
+                              "toisin"   {- instr -}
+                              "?"        {- other -}
+            )
+          , (3, \c -> infForms inf c
+                              -- singular
+                              "kolmas"      {- nom -} "kolmas"      {- acc -}
+                              "kolmannen"   {- gen -} "kolmatta"    {- ptv -}
+                              "kolmantena"  {- ess -} "kolmanneksi" {- transl -}
+                              "kolmannessa" {- ine -} "kolmannesta" {- ela -}
+                              "kolmanteen"  {- ill -} "kolmannella" {- ade -}
+                              "kolmannelta" {- abl -} "kolmannelle" {- all -}
+                              "kolmannetta" {- abe -}
+                              "?"           {- other -}
+                              -- plural
+                              "kolmannet"   {- nom -} "kolmannet"   {- acc -}
+                              "kolmansien"  {- gen -} "kolmansia"   {- ptv -}
+                              "kolmansina"  {- ess -} "kolmansiksi" {- transl -}
+                              "kolmansissa" {- ine -} "kolmansista" {- ela -}
+                              "kolmansiin"  {- ill -} "kolmansilla" {- ade -}
+                              "kolmansilta" {- abl -} "kolmansille" {- all -}
+                              "kolmansitta" {- abe -} "kolmansine"  {- com -}
+                              "kolmansin"   {- instr -}
+                              "?"           {- other -}
+            )
+          , (4, \c -> infForms inf c
+                              -- singular
+                              "neljäs"      {- nom -} "neljäs"      {- acc -}
+                              "neljännen"   {- gen -} "neljättä"    {- ptv -}
+                              "neljäntenä"  {- ess -} "neljänneksi" {- transl -}
+                              "neljännessä" {- ine -} "neljännestä" {- ela -}
+                              "neljänteen"  {- ill -} "neljännellä" {- ade -}
+                              "neljänneltä" {- abl -} "neljännelle" {- all -}
+                              "neljännettä" {- abe -}
+                              (case inf of
+                                 _ | isComitative  inf -> "neljänsine"
+                                   | isInstructive inf -> "neljänsin"
+                                   | otherwise         -> "?"
+                              )
+                              -- plural
+                              "neljännet"   {- nom -} "neljännet"   {- acc -}
+                              "neljänsien"  {- gen -} "neljänsiä"   {- ptv -}
+                              "neljänsinä"  {- ess -} "neljänsiksi" {- transl -}
+                              "neljänsissä" {- ine -} "neljänsistä" {- ela -}
+                              "neljänsiin"  {- ill -} "neljänsillä" {- ade -}
+                              "neljänsiltä" {- abl -} "neljänsille" {- all -}
+                              "neljänsittä" {- abe -} "neljänsine"  {- com -}
+                              "neljänsin"   {- instr -}
+                              "?"           {- other -}
+            )
+          , (5, \c -> infForms inf c
+                              -- singular
+                              "viides"      {- nom -} "viides"      {- acc -}
+                              "viidennen"   {- gen -} "viidettä"    {- ptv -}
+                              "viidentenä"  {- ess -} "viidenneksi" {- transl -}
+                              "viidennessä" {- ine -} "viidennestä" {- ela -}
+                              "viidenteen"  {- ill -} "viidennellä" {- ade -}
+                              "viidenneltä" {- abl -} "viidennelle" {- all -}
+                              "viidennettä" {- abe -}
+                              "?"           {- other -}
+                              -- plural
+                              "viidennet"   {- nom -} "viidennet"   {- acc -}
+                              "viidensien"  {- gen -} "viidensiä"   {- ptv -}
+                              "viidensinä"  {- ess -} "viidensiksi" {- transl -}
+                              "viidensissä" {- ine -} "viidensistä" {- ela -}
+                              "viidensiin"  {- ill -} "viidensillä" {- ade -}
+                              "viidensiltä" {- abl -} "viidensille" {- all -}
+                              "viidensittä" {- abe -} "viidensine"  {- com -}
+                              "viidensin"   {- instr -}
+                              "?"           {- other -}
+            )
+          , (6, \c -> infForms inf c
+                              -- singular
+                              "kuudes"      {- nom -} "kuudes"      {- acc -}
+                              "kuudennen"   {- gen -} "kuudetta"    {- ptv -}
+                              "kuudentena"  {- ess -} "kuudenneksi" {- transl -}
+                              "kuudennessa" {- ine -} "kuudennesta" {- ela -}
+                              "kuudenteen"  {- ill -} "kuudennella" {- ade -}
+                              "kuudennelta" {- abl -} "kuudennelle" {- all -}
+                              "kuudennetta" {- abe -}
+                              "?"           {- other -}
+                              -- plural
+                              "kuudennet"   {- nom -} "kuudennet"   {- acc -}
+                              "kuudensien"  {- gen -} "kuudensia"   {- ptv -}
+                              "kuudensina"  {- ess -} "kuudensiksi" {- transl -}
+                              "kuudensissa" {- ine -} "kuudensista" {- ela -}
+                              "kuudensiin"  {- ill -} "kuudensilla" {- ade -}
+                              "kuudensilta" {- abl -} "kuudensille" {- all -}
+                              "kuudensitta" {- abe -} "kuudensine"  {- com -}
+                              "kuudensin"   {- instr -}
+                              "?"           {- other -}
+            )
+          , (7, \c -> infForms inf c
+                              -- singular
+                              "seitsemäs"      {- nom -} "seitsemäs"      {- acc -}
+                              "seitsemännen"   {- gen -} "seitsemättä"    {- ptv -}
+                              "seitsemäntenä"  {- ess -} "seitsemänneksi" {- transl -}
+                              "seitsemännessä" {- ine -} "seitsemännestä" {- ela -}
+                              "seitsemänteen"  {- ill -} "seitsemännellä" {- ade -}
+                              "seitsemänneltä" {- abl -} "seitsemännelle" {- all -}
+                              "seitsemännettä" {- abe -}
+                              "?"              {- other -}
+                              -- plural
+                              "seitsemännet"   {- nom -} "seitsemännet"   {- acc -}
+                              "seitsemänsien"  {- gen -} "seitsemänsiä"   {- ptv -}
+                              "seitsemänsinä"  {- ess -} "seitsemänsiksi" {- transl -}
+                              "seitsemänsissä" {- ine -} "seitsemänsistä" {- ela -}
+                              "seitsemänsiin"  {- ill -} "seitsemänsillä" {- ade -}
+                              "seitsemänsiltä" {- abl -} "seitsemänsille" {- all -}
+                              "seitsemänsittä" {- abe -} "seitsemänsine"  {- com -}
+                              "seitsemänsin"   {- instr -}
+                              "?"              {- other -}
+            )
+          , (8, \c -> infForms inf c
+                              -- singular
+                              "kahdeksas"      {- nom -} "kahdeksas"      {- acc -}
+                              "kahdeksannen"   {- gen -} "kahdeksatta"    {- ptv -}
+                              "kahdeksantena"  {- ess -} "kahdeksanneksi" {- transl -}
+                              "kahdeksannessa" {- ine -} "kahdeksannesta" {- ela -}
+                              "kahdeksanteen"  {- ill -} "kahdeksannella" {- ade -}
+                              "kahdeksannelta" {- abl -} "kahdeksannelle" {- all -}
+                              "kahdeksannetta" {- abe -}
+                              "?"              {- other -}
+                              -- plural
+                              "kahdeksannet"   {- nom -} "kahdeksannet"   {- acc -}
+                              "kahdeksansien"  {- gen -} "kahdeksansia"   {- ptv -}
+                              "kahdeksansina"  {- ess -} "kahdeksansiksi" {- transl -}
+                              "kahdeksansissa" {- ine -} "kahdeksansista" {- ela -}
+                              "kahdeksansiin"  {- ill -} "kahdeksansilla" {- ade -}
+                              "kahdeksansilta" {- abl -} "kahdeksansille" {- all -}
+                              "kahdeksansitta" {- abe -} "kahdeksansine"  {- com -}
+                              "kahdeksansin"   {- instr -}
+                              "?"              {- other -}
+            )
+          , (9, \c -> infForms inf c
+                              -- singular
+                              "yhdeksäs"      {- nom -} "yhdeksäs"      {- acc -}
+                              "yhdeksännen"   {- gen -} "yhdeksättä"    {- ptv -}
+                              "yhdeksäntenä"  {- ess -} "yhdeksänneksi" {- transl -}
+                              "yhdeksännessä" {- ine -} "yhdeksännestä" {- ela -}
+                              "yhdeksänteen"  {- ill -} "yhdeksännellä" {- ade -}
+                              "yhdeksänneltä" {- abl -} "yhdeksännelle" {- all -}
+                              "yhdeksännettä" {- abe -}
+                              "?"             {- other -}
+                              -- plural
+                              "yhdeksännet"   {- nom -} "yhdeksännet"   {- acc -}
+                              "yhdeksänsien"  {- gen -} "yhdeksänsiä"   {- ptv -}
+                              "yhdeksänsinä"  {- ess -} "yhdeksänsiksi" {- transl -}
+                              "yhdeksänsissä" {- ine -} "yhdeksänsistä" {- ela -}
+                              "yhdeksänsiin"  {- ill -} "yhdeksänsillä" {- ade -}
+                              "yhdeksänsiltä" {- abl -} "yhdeksänsille" {- all -}
+                              "yhdeksänsittä" {- abe -} "yhdeksänsine"  {- com -}
+                              "yhdeksänsin"   {- instr -}
+                              "?"             {- other -}
+            )
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit _) _ -> "toista" -- singular partitive ordinal 2
+                        _ -> infForms inf c
+                                 -- singular
+                                 "kymmenes"      {- nom -} "kymmenes"      {- acc -}
+                                 "kymmenennen"   {- gen -} "kymmenettä"    {- ptv -}
+                                 "kymmenentenä"  {- ess -} "kymmenenneksi" {- transl -}
+                                 "kymmenennessä" {- ine -} "kymmenennestä" {- ela -}
+                                 "kymmenenteen"  {- ill -} "kymmenennellä" {- ade -}
+                                 "kymmenenneltä" {- abl -} "kymmenennelle" {- all -}
+                                 "kymmenennettä" {- abe -}
+                                 "?"             {- other -}
+                                 -- plural
+                                 "kymmenennet"   {- nom -} "kymmenennet"   {- acc -}
+                                 "kymmenensien"  {- gen -} "kymmenensiä"   {- ptv -}
+                                 "kymmenensinä"  {- ess -} "kymmenensiksi" {- transl -}
+                                 "kymmenensissä" {- ine -} "kymmenensistä" {- ela -}
+                                 "kymmenensiin"  {- ill -} "kymmenensillä" {- ade -}
+                                 "kymmenensiltä" {- abl -} "kymmenensille" {- all -}
+                                 "kymmenensittä" {- abe -} "kymmenensine"  {- com -}
+                                 "kymmenensin"   {- instr -}
+                                 "?"             {- other -}
+            )
+          , (100, \c -> case c of
+                         _ -> infForms inf c
+                               -- singular
+                               "sadas"      {- nom -} "sadas"      {- acc -}
+                               "sadannen"   {- gen -} "sadatta"    {- ptv -}
+                               "sadantena"  {- ess -} "sadanneksi" {- transl -}
+                               "sadannessa" {- ine -} "sadannesta" {- ela -}
+                               "sadanteen"  {- ill -} "sadannella" {- ade -}
+                               "sadannelta" {- abl -} "sadannelle" {- all -}
+                               "sadannetta" {- abe -}
+                               "?"          {- other -}
+                               -- plural
+                               "sadannet"   {- nom -} "sadannet"   {- acc -}
+                               "sadansien"  {- gen -} "sadansia"   {- ptv -}
+                               "sadansina"  {- ess -} "sadansiksi" {- transl -}
+                               "sadansissa" {- ine -} "sadansista" {- ela -}
+                               "sadansiin"  {- ill -} "sadansilla" {- ade -}
+                               "sadansilta" {- abl -} "sadansille" {- all -}
+                               "sadansitta" {- abe -} "sadansine"  {- com -}
+                               "sadansin"   {- instr -}
+                               "?"          {- other -}
+            )
+          , (1000, \c -> case c of
+                         _ -> infForms inf c
+                               -- singular
+                               "tuhannes"      {- nom -} "tuhannes"      {- acc -}
+                               "tuhannennen"   {- gen -} "tuhannetta"    {- ptv -}
+                               "tuhannentena"  {- ess -} "tuhannenneksi" {- transl -}
+                               "tuhannennessa" {- ine -} "tuhannennesta" {- ela -}
+                               "tuhannenteen"  {- ill -} "tuhannennella" {- ade -}
+                               "tuhannennelta" {- abl -} "tuhannennelle" {- all -}
+                               "tuhannennetta" {- abe -}
+                               "?"             {- other -}
+                               -- plural
+                               "tuhannennet"   {- nom -} "tuhannennet"   {- acc -}
+                               "tuhannensien"  {- gen -} "tuhannensia"   {- ptv -}
+                               "tuhannensina"  {- ess -} "tuhannensiksi" {- transl -}
+                               "tuhannensissa" {- ine -} "tuhannensista" {- ela -}
+                               "tuhannensiin"  {- ill -} "tuhannensilla" {- ade -}
+                               "tuhannensilta" {- abl -} "tuhannensille" {- all -}
+                               "tuhannensitta" {- abe -} "tuhannensine"  {- com -}
+                               "tuhannensin"   {- instr -}
+                               "?"             {- other -}
+            )
+          ]
+
+infForms :: Inflection -> Ctx Exp
+         -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text
+         -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text
+         -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text
+infForms inf _
+         s_nom s_acc s_gen s_ptv s_ess s_transl
+         s_ine s_ela s_ill s_ade s_abl s_all s_abe
+         s_other
+         p_nom p_acc p_gen p_ptv p_ess p_transl
+         p_ine p_ela p_ill p_ade p_abl p_all p_abe p_com p_instr
+         p_other
+    | isSingular inf = singularForms
+    | isPlural   inf = pluralForms
+    | otherwise        = "?"
+  where
+    singularForms
+        | isNominative       inf = s_nom
+        | isAccusative       inf = s_acc
+        | isGenitive         inf = s_gen
+        | isPartitive        inf = s_ptv
+        | isEssive           inf = s_ess
+        | isTranslative      inf = s_transl
+        | isLocativeInessive inf = s_ine
+        | isLocativeElative  inf = s_ela
+        | isLocativeIllative inf = s_ill
+        | isLocativeAdessive inf = s_ade
+        | isLocativeAblative inf = s_abl
+        | isLocativeAllative inf = s_all
+        | isAbessive         inf = s_abe
+        | otherwise              = s_other
+    pluralForms
+        | isNominative       inf = p_nom
+        | isAccusative       inf = p_acc
+        | isGenitive         inf = p_gen
+        | isPartitive        inf = p_ptv
+        | isEssive           inf = p_ess
+        | isTranslative      inf = p_transl
+        | isLocativeInessive inf = p_ine
+        | isLocativeElative  inf = p_ela
+        | isLocativeIllative inf = p_ill
+        | isLocativeAdessive inf = p_ade
+        | isLocativeAblative inf = p_abl
+        | isLocativeAllative inf = p_all
+        | isAbessive         inf = p_abe
+        | isComitative       inf = p_com
+        | isInstructive      inf = p_instr
+        | otherwise              = p_other
diff --git a/src/Text/Numeral/Language/FR.hs b/src/Text/Numeral/Language/FR.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/FR.hs
+++ /dev/null
@@ -1,259 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        fr
-
-[@ISO639-2B@]       fre
-
-[@ISO639-3@]        fra
-
-[@Native name@]     Français
-
-[@English name@]    French
--}
-
-module Text.Numeral.Language.FR
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-    , ordinal
-      -- * Structure
-    , cardinalStruct
-    , ordinalStruct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( (<) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Ord.Unicode ( (≤), (≥) )
-import "base-unicode-symbols" Prelude.Unicode ( ℤ )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum  as BN
-import qualified "this" Text.Numeral.Exp     as E
-import qualified "this" Text.Numeral.Grammar as G
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- FR
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "fr"
-    , entIso639_2    = ["fre"]
-    , entIso639_3    = Just "fra"
-    , entNativeNames = ["Français"]
-    , entEnglishName = Just "French"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = cardinalStruct
-                       }
-    , entOrdinal     = Just Conversion
-                       { toNumeral   = ordinal
-                       , toStructure = ordinalStruct
-                       }
-    }
-
-cardinal ∷ (G.Feminine i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ cardinalStruct
-
-ordinal ∷ (G.Feminine i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-ordinal inf = ordinalRepr inf ∘ ordinalStruct
-
-cardinalStruct ∷ ( Integral α, E.Scale α
-                 , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-                 )
-               ⇒ α → β
-cardinalStruct = pos $ fix $ rule `combine` pelletierScale1 R L BN.rule
-
-ordinalStruct ∷ ( Integral α, E.Scale α
-                , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-                )
-              ⇒ α → β
-ordinalStruct = pos $ fix $ rule `combine` pelletierScale R L BN.rule
-
-rule ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ Rule α β
-rule = findRule (   0, lit         )
-              [ (  11, add   10 L  )
-              , (  17, add   10 R  )
-              , (  20, lit         )
-              , (  21, add   20 R  )
-              , (  30, mul   10 R L)
-              , (  70, add   60 R  )
-              , (  80, mul   20 R L)
-              , (  89, add   80 R  )
-              , ( 100, step  100   10 R L)
-              , (1000, step 1000 1000 R L)
-              ]
-                (dec 6 - 1)
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-genericRepr ∷ Repr i
-genericRepr = defaultRepr
-              { reprAdd   = Just (⊞)
-              , reprMul   = Just (⊡)
-              , reprNeg   = Just $ \_ _ → "moins "
-              }
-    where
-      (Lit n                ⊞ Lit 10) _       | n ≤ 6 = ""
-      (Lit 10               ⊞ Lit n ) _       | n ≥ 7 = "-"
-      ((Lit 4 `Mul` Lit 20) ⊞ _     ) _               = "-"
-      (_                    ⊞ (Lit 1 `Add` Lit 10)) _ = " et "
-      (_                    ⊞ Lit 1               ) _ = " et "
-      ((Lit _ `Mul` Lit 10) ⊞ _                   ) _ = "-"
-      (Lit 20               ⊞ _                   ) _ = "-"
-      (_                    ⊞ _                   ) _ = " "
-
-      (_ ⊡ Lit 10) _ = ""
-      (_ ⊡ Lit 20) _ = "-"
-      (_ ⊡ _     ) _ = " "
-
-cardinalRepr ∷ (G.Feminine i) ⇒ i → Exp i → Maybe Text
-cardinalRepr = render genericRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
-               , reprScale = BN.pelletierRepr (BN.quantityName "illion"  "illions")
-                                              (BN.quantityName "illiard" "illiards")
-                                              bigNumSyms
-               }
-    where
-      syms inf =
-          M.fromList
-          [ (0, const "zéro")
-          , (1, \c → case c of
-                       CtxAdd _ (Lit 10) _  → "on"
-                       _ | G.isFeminine inf → "une"
-                         | otherwise        → "un"
-            )
-          , (2, ten   "deux"   "dou"    "deux")
-          , (3, ten   "trois"  "trei"   "tren")
-          , (4, ten   "quatre" "quator" "quar")
-          , (5, ten   "cinq"   "quin"   "cinqu")
-          , (6, ten   "six"    "sei"    "soix")
-          , (7, const "sept")
-          , (8, const "huit")
-          , (9, const "neuf")
-          , (10, \c → case c of
-                        CtxAdd _ (Lit n) _ | n < 7     → "ze"
-                                           | otherwise → "dix"
-                        CtxMul _ (Lit 3) _             → "te"
-                        CtxMul R _       _             → "ante"
-                        _                              → "dix"
-            )
-          , (20, \c → case c of
-                        CtxMul _ _ CtxEmpty → "vingts"
-                        _                   → "vingt"
-            )
-          , (100, \c → case c of
-                         CtxMul R _ CtxEmpty → "cents"
-                         _                   → "cent"
-            )
-          , (1000, const "mille")
-          ]
-
-      ten n a m ctx = case ctx of
-                        CtxAdd _ (Lit 10) _ → a
-                        CtxMul _ (Lit 10) _ → m
-                        _                   → n
-
-ordinalRepr ∷ (G.Feminine i) ⇒ i → Exp i → Maybe Text
-ordinalRepr = render genericRepr
-              { reprValue = \inf n → M.lookup n (syms inf)
-              , reprScale = BN.pelletierRepr ( BN.ordQuantityName "illion"  "illionième"
-                                                                  "illions" "illionième"
-                                             )
-                                             ( BN.ordQuantityName "illiard"  "illiardième"
-                                                                  "illiards" "illiardième"
-                                             )
-                                             bigNumSyms
-              }
-    where
-      syms inf =
-          M.fromList
-          [ (0, \c → case c of
-                       CtxEmpty → "zéroth"
-                       _        → "zéro"
-            )
-          , (1, \c → case c of
-                       CtxEmpty
-                         | G.isFeminine inf → "première"
-                         | otherwise        → "premier"
-                       CtxAdd _ (Lit 10) _  → "on"
-                       _ | isOutside R c    → if G.isFeminine inf
-                                              then "uneième"
-                                              else "unième"
-                         | G.isFeminine inf → "une"
-                         | otherwise        → "un"
-            )
-          , (2, ten   "deuxième"  "deux"   "dou"    "deux")
-          , (3, ten   "troisième" "trois"  "trei"   "tren")
-          , (4, ten   "quatrième" "quatre" "quator" "quar")
-          , (5, ten   "cinquième" "cinq"   "quin"   "cinqu")
-          , (6, ten   "sixième"   "six"    "sei"    "soix")
-          , (7, \c → if isOutside R c then "septième" else "sept")
-          , (8, \c → if isOutside R c then "huitième" else "huit")
-          , (9, \c → if isOutside R c then "neuvième" else "neuf")
-          , (10, \c → case c of
-                        CtxAdd R (Lit _) _ | isOutside R c → "zième"
-                                           | otherwise     → "ze"
-                        CtxAdd L (Lit _) _                 → "dix"
-                        CtxMul _ (Lit 3) _ | isOutside R c → "tième"
-                                           | otherwise     → "te"
-                        CtxMul R _       _ | isOutside R c → "antième"
-                                           | otherwise     → "ante"
-                        _                  | isOutside R c → "dixième"
-                                           | otherwise     → "dix"
-            )
-          , (20, \c → case c of
-                        _ | isOutside R c → "vingtième"
-                        CtxMul _ _ CtxEmpty → "vingts"
-                        _                   → "vingt"
-            )
-          , (100, \c → case c of
-                         _ | isOutside R c   → "centième"
-                         CtxMul R _ CtxEmpty → "cents"
-                         _                   → "cent"
-            )
-          , (1000, \c → if isOutside R c then "millième" else "mille")
-          ]
-
-      ten o n a m ctx =
-          case ctx of
-            CtxAdd _ (Lit 10) _ | isOutside R ctx → o
-                                | otherwise       → a
-            CtxMul _ (Lit 10) _ | isOutside R ctx → o
-                                | otherwise       → m
-            _                   | isOutside R ctx → o
-                                | otherwise       → n
-
-bigNumSyms ∷ [(ℤ, Ctx (Exp i) → Text)]
-bigNumSyms =
-    [ (1, BN.forms "m"  "uno" "uno"  ""    "")
-    , (3, BN.forms "tr" "tré" "tres" "tri" "tre")
-    , (10, \c → case c of
-                  CtxAdd _ (Lit 100) _              → "deci"
-                  CtxMul _ _ (CtxAdd _ (Lit 100) _) → "ginta"
-                  CtxMul {}                         → "gint"
-                  _                                 → "déc"
-      )
-    ]
diff --git a/src/Text/Numeral/Language/FRA.hs b/src/Text/Numeral/Language/FRA.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/FRA.hs
@@ -0,0 +1,238 @@
+{-|
+[@ISO639-1@]        fr
+
+[@ISO639-2B@]       fre
+
+[@ISO639-3@]        fra
+
+[@Native name@]     Français
+
+[@English name@]    French
+-}
+
+module Text.Numeral.Language.FRA
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+    , ordinal
+      -- * Structure
+    , cardinalStruct
+    , ordinalStruct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum  as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- FRA
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "fr"
+    , entIso639_2    = ["fre"]
+    , entIso639_3    = Just "fra"
+    , entNativeNames = ["Français"]
+    , entEnglishName = Just "French"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = cardinalStruct
+                       }
+    , entOrdinal     = Just Conversion
+                       { toNumeral   = ordinal
+                       , toStructure = ordinalStruct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . cardinalStruct
+
+ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+ordinal inf = ordinalRepr inf . ordinalStruct
+
+cardinalStruct :: (Integral a) => a -> Exp
+cardinalStruct = pos $ fix $ rule `combine` pelletierScale1 R L BN.rule
+
+ordinalStruct :: (Integral a) => a -> Exp
+ordinalStruct = pos $ fix $ rule `combine` pelletierScale R L BN.rule
+
+rule :: (Integral a) => Rule a
+rule = findRule (   0, lit         )
+              [ (  11, add   10 L  )
+              , (  17, add   10 R  )
+              , (  20, lit         )
+              , (  21, add   20 R  )
+              , (  30, mul   10 R L)
+              , (  70, add   60 R  )
+              , (  80, mul   20 R L)
+              , (  89, add   80 R  )
+              , ( 100, step  100   10 R L)
+              , (1000, step 1000 1000 R L)
+              ]
+                (dec 6 - 1)
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+genericRepr :: Repr
+genericRepr = defaultRepr
+              { reprAdd   = Just (⊞)
+              , reprMul   = Just (⊡)
+              , reprNeg   = Just $ \_ _ -> "moins "
+              }
+    where
+      (Lit n                ⊞ Lit 10) _       | n <= 6 = ""
+      (Lit 10               ⊞ Lit n ) _       | n >= 7 = "-"
+      ((Lit 4 `Mul` Lit 20) ⊞ _     ) _                = "-"
+      (_                    ⊞ (Lit 1 `Add` Lit 10)) _  = " et "
+      (_                    ⊞ Lit 1               ) _  = " et "
+      ((Lit _ `Mul` Lit 10) ⊞ _                   ) _  = "-"
+      (Lit 20               ⊞ _                   ) _  = "-"
+      (_                    ⊞ _                   ) _  = " "
+
+      (_ ⊡ Lit 10) _ = ""
+      (_ ⊡ Lit 20) _ = "-"
+      (_ ⊡ _     ) _ = " "
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render genericRepr
+               { reprValue = \inf n -> M.lookup n (syms inf)
+               , reprScale = BN.pelletierRepr (BN.quantityName "illion"  "illions")
+                                              (BN.quantityName "illiard" "illiards")
+                                              bigNumSyms
+               }
+    where
+      syms inf =
+          M.fromList
+          [ (0, const "zéro")
+          , (1, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "on"
+                       _ | isFeminine inf  -> "une"
+                         | otherwise       -> "un"
+            )
+          , (2, ten   "deux"   "dou"    "deux")
+          , (3, ten   "trois"  "trei"   "tren")
+          , (4, ten   "quatre" "quator" "quar")
+          , (5, ten   "cinq"   "quin"   "cinqu")
+          , (6, ten   "six"    "sei"    "soix")
+          , (7, const "sept")
+          , (8, const "huit")
+          , (9, const "neuf")
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit n) _ | n < 7     -> "ze"
+                                           | otherwise -> "dix"
+                        CtxMul _ (Lit 3) _             -> "te"
+                        CtxMul R _       _             -> "ante"
+                        _                              -> "dix"
+            )
+          , (20, \c -> case c of
+                        CtxMul _ _ CtxEmpty -> "vingts"
+                        _                   -> "vingt"
+            )
+          , (100, \c -> case c of
+                         CtxMul R _ CtxEmpty -> "cents"
+                         _                   -> "cent"
+            )
+          , (1000, const "mille")
+          ]
+
+      ten n a m ctx = case ctx of
+                        CtxAdd _ (Lit 10) _ -> a
+                        CtxMul _ (Lit 10) _ -> m
+                        _                   -> n
+
+ordinalRepr :: Inflection -> Exp -> Maybe Text
+ordinalRepr = render genericRepr
+              { reprValue = \inf n -> M.lookup n (syms inf)
+              , reprScale = BN.pelletierRepr ( BN.ordQuantityName "illion"  "illionième"
+                                                                  "illions" "illionième"
+                                             )
+                                             ( BN.ordQuantityName "illiard"  "illiardième"
+                                                                  "illiards" "illiardième"
+                                             )
+                                             bigNumSyms
+              }
+    where
+      syms inf =
+          M.fromList
+          [ (0, \c -> case c of
+                       CtxEmpty -> "zéroth"
+                       _        -> "zéro"
+            )
+          , (1, \c -> case c of
+                       CtxEmpty
+                         | isFeminine inf  -> "première"
+                         | otherwise       -> "premier"
+                       CtxAdd _ (Lit 10) _ -> "on"
+                       _ | isOutside R c   -> if isFeminine inf
+                                              then "uneième"
+                                              else "unième"
+                         | isFeminine inf  -> "une"
+                         | otherwise       -> "un"
+            )
+          , (2, ten   "deuxième"  "deux"   "dou"    "deux")
+          , (3, ten   "troisième" "trois"  "trei"   "tren")
+          , (4, ten   "quatrième" "quatre" "quator" "quar")
+          , (5, ten   "cinquième" "cinq"   "quin"   "cinqu")
+          , (6, ten   "sixième"   "six"    "sei"    "soix")
+          , (7, \c -> if isOutside R c then "septième" else "sept")
+          , (8, \c -> if isOutside R c then "huitième" else "huit")
+          , (9, \c -> if isOutside R c then "neuvième" else "neuf")
+          , (10, \c -> case c of
+                        CtxAdd R (Lit _) _ | isOutside R c -> "zième"
+                                           | otherwise     -> "ze"
+                        CtxAdd L (Lit _) _                 -> "dix"
+                        CtxMul _ (Lit 3) _ | isOutside R c -> "tième"
+                                           | otherwise     -> "te"
+                        CtxMul R _       _ | isOutside R c -> "antième"
+                                           | otherwise     -> "ante"
+                        _                  | isOutside R c -> "dixième"
+                                           | otherwise     -> "dix"
+            )
+          , (20, \c -> case c of
+                        _ | isOutside R c -> "vingtième"
+                        CtxMul _ _ CtxEmpty -> "vingts"
+                        _                   -> "vingt"
+            )
+          , (100, \c -> case c of
+                         _ | isOutside R c   -> "centième"
+                         CtxMul R _ CtxEmpty -> "cents"
+                         _                   -> "cent"
+            )
+          , (1000, \c -> if isOutside R c then "millième" else "mille")
+          ]
+
+      ten o n a m ctx =
+          case ctx of
+            CtxAdd _ (Lit 10) _ | isOutside R ctx -> o
+                                | otherwise       -> a
+            CtxMul _ (Lit 10) _ | isOutside R ctx -> o
+                                | otherwise       -> m
+            _                   | isOutside R ctx -> o
+                                | otherwise       -> n
+
+bigNumSyms :: [(Integer, Ctx Exp -> Text)]
+bigNumSyms =
+    [ (1, BN.forms "m"  "uno" "uno"  ""    "")
+    , (3, BN.forms "tr" "tré" "tres" "tri" "tre")
+    , (10, \c -> case c of
+                  CtxAdd _ (Lit 100) _              -> "deci"
+                  CtxMul _ _ (CtxAdd _ (Lit 100) _) -> "ginta"
+                  CtxMul {}                         -> "gint"
+                  _                                 -> "déc"
+      )
+    ]
diff --git a/src/Text/Numeral/Language/FUR.hs b/src/Text/Numeral/Language/FUR.hs
--- a/src/Text/Numeral/Language/FUR.hs
+++ b/src/Text/Numeral/Language/FUR.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,20 +26,13 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M
 import           "this" Text.Numeral
 import qualified "this" Text.Numeral.BigNum  as BN
-import qualified "this" Text.Numeral.Exp     as E
-import qualified "this" Text.Numeral.Grammar as G
 import           "this" Text.Numeral.Misc ( dec )
 import           "this" Text.Numeral.Entry
-import qualified "this" Text.Numeral.Language.IT as IT ( rule )
+import qualified "this" Text.Numeral.Language.ITA as ITA ( rule )
 import           "this" Text.Numeral.Render.Utils ( addCtx, mulCtx )
 import "text" Data.Text ( Text )
 
@@ -53,7 +41,7 @@
 -- FUR
 --------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_2    = ["fur"]
     , entIso639_3    = Just "fur"
@@ -65,22 +53,18 @@
                        }
     }
 
-cardinal ∷ (G.Masculine i, G.Feminine i, Integral α, E.Scale α)
-         ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Add β, E.Mul β, E.Scale β
-         )
-       ⇒ α → β
-struct = fix $ IT.rule `combine` pelletierScale1 R L BN.rule
+struct :: (Integral a) => a -> Exp
+struct = fix $ ITA.rule `combine` pelletierScale1 R L BN.rule
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = let x = dec 12 - 1 in (negate x, x)
 
-cardinalRepr ∷ (G.Feminine i, G.Masculine i) ⇒ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
+               { reprValue = \inf n -> M.lookup n (syms inf)
                , reprAdd   = Just (⊞)
                , reprMul   = Just (⊡)
                , reprScale = BN.pelletierRepr
@@ -107,14 +91,14 @@
       syms inf =
           M.fromList
           [ (0, const "zero")
-          , (1, \c → case c of
-                       _ | G.isFeminine  inf → "une"
-                         | otherwise         → "un"
+          , (1, \c -> case c of
+                       _ | isFeminine  inf -> "une"
+                         | otherwise       -> "un"
             )
           , (2, addCtx 10 "do" $ mulCtx 100 "dus"
-                $ \c → case c of
-                         _ | G.isFeminine inf → "dôs"
-                           | otherwise        → "doi"
+                $ \c -> case c of
+                         _ | isFeminine inf -> "dôs"
+                           | otherwise      -> "doi"
             )
           , (3, addCtx 10  "tre"  $ mulCtx 10 "tr"
               $ mulCtx 100 "tres" $ const     "trê"
@@ -125,21 +109,21 @@
           , (7,                      mulCtx 10 "set"   $ const "siet")
           , (8,                      mulCtx 10 "ot"    $ const "vot")
           , (9,                      mulCtx 10 "nov"   $ const "nûf")
-          , (10, \c → case c of
+          , (10, \c -> case c of
                         CtxAdd R (Lit n) _
-                            | n ≤ 7        → "dis"
-                        CtxAdd L _       _ → "dise"
-                        CtxMul _ (Lit 3) _ → "ente"
+                            | n <= 7       -> "dis"
+                        CtxAdd L _       _ -> "dise"
+                        CtxMul _ (Lit 3) _ -> "ente"
                         CtxMul _ (Lit n) _
-                            | n ≤ 9        → "ante"
-                        _                  → "dîs"
+                            | n <= 9       -> "ante"
+                        _                  -> "dîs"
             )
           , (20, const "vincj")
-          , (100, \c → case c of
+          , (100, \c -> case c of
                          CtxMul _ (Lit n) _
-                             | n ≤ 3     → "inte"
-                             | otherwise → "cent"
-                         _               → "cent"
+                             | n <= 3    -> "inte"
+                             | otherwise -> "cent"
+                         _               -> "cent"
             )
           , (1000, const "mil")
           ]
diff --git a/src/Text/Numeral/Language/GLV.hs b/src/Text/Numeral/Language/GLV.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/GLV.hs
@@ -0,0 +1,113 @@
+{-|
+[@ISO639-1@]        gv
+
+[@ISO639-2@]        glv
+
+[@ISO639-3@]        glv
+
+[@Native name@]     Gaelg
+
+[@English name@]    Manx
+-}
+
+module Text.Numeral.Language.GLV
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- GLV
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "gv"
+    , entIso639_2    = ["glv"]
+    , entIso639_3    = Just "glv"
+    , entNativeNames = ["Gaelg"]
+    , entEnglishName = Just "Manx"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = checkPos
+       $ fix
+       $ findRule (   1, lit       )
+                [ (  11, add 10 L  )
+                , (  20, lit       )
+                , (  21, add 20 L  )
+                , (  40, lit       )
+                , (  41, add 40 L  )
+                , (  60, mul 20 R L)
+                , ( 100, step 100 10 R L)
+                , (1000, lit)
+                ]
+                   1000
+
+bounds :: (Integral a) => (a, a)
+bounds = (1, 1000)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just $ \_ _ _ -> " "
+               }
+    where
+      ((Lit _ `Mul` Lit 20) ⊞ Lit 10) _ = " as "
+      (_                    ⊞ Lit 10) _ = "-"
+      (_                    ⊞ _     ) _ = " as "
+
+      syms =
+          M.fromList
+          [ (1, const "nane")
+          , (2, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "daa"
+                       CtxMul {}           -> "daa"
+                       _                   -> "jees"
+            )
+          , (3, const "tree")
+          , (4, const "kiare")
+          , (5, const "queig")
+          , (6, const "shey")
+          , (7, const "shiaght")
+          , (8, const "hoght")
+          , (9, const "nuy")
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit 2)              _ -> "yeig"
+                        CtxAdd _ (Lit _ `Mul` Lit 20) _ -> "jeih"
+                        CtxAdd R _                    _ -> "jeig"
+                        _                               -> "jeih"
+            )
+          , (20, const "feed")
+          , (40, const "daeed")
+          , (100, \c -> case c of
+                         CtxMul {} -> "cheead"
+                         _         -> "keead"
+            )
+          , (1000, const "thousane")
+          ]
diff --git a/src/Text/Numeral/Language/GSW.hs b/src/Text/Numeral/Language/GSW.hs
--- a/src/Text/Numeral/Language/GSW.hs
+++ b/src/Text/Numeral/Language/GSW.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,16 +26,10 @@
 -- Imports
 -------------------------------------------------------------------------------
 
-import "base" Data.Function ( ($), const )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
 import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Language.DE ( struct )
+import "this" Text.Numeral
+import "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Language.DEU ( struct )
 import "this" Text.Numeral.Entry
 import "text" Data.Text ( Text )
 
@@ -49,7 +38,7 @@
 -- GSW
 --------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_2    = ["gse"]
     , entIso639_3    = Just "gse"
@@ -61,64 +50,64 @@
                        }
     }
 
-cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = let x = dec 6 - 1 in (negate x, x)
 
-genericRepr ∷ Repr i
+genericRepr :: Repr
 genericRepr = defaultRepr
               { reprAdd   = Just (⊞)
-              , reprMul   = Just $ \_ _ _ → ""
+              , reprMul   = Just $ \_ _ _ -> ""
               }
     where
       (_       ⊞ (_ `Mul` Lit 10)) _ = "e"
       (Lit 100 ⊞ Lit 1)            _ = "und"
       (_       ⊞ _ )               _ = ""
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render genericRepr
-               { reprValue = \_ n → M.lookup n syms }
+               { reprValue = \_ n -> M.lookup n syms }
     where
       syms =
           M.fromList
-          [ (1, \c → case c of
-                       CtxAdd _ (Lit 100) _ → "äis"
-                       CtxAdd {}            → "ein"
-                       _                    → "eis"
+          [ (1, \c -> case c of
+                       CtxAdd _ (Lit 100) _ -> "äis"
+                       CtxAdd {}            -> "ein"
+                       _                    -> "eis"
             )
-          , (2, \c → case c of
-                       CtxMul _ (Lit 10) _ → "zwän"
-                       _                   → "zwöi"
+          , (2, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "zwän"
+                       _                   -> "zwöi"
             )
-          , (3, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "dry"
-                       CtxMul _ (Lit 10) _ → "drys"
-                       _                   → "drü"
+          , (3, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "dry"
+                       CtxMul _ (Lit 10) _ -> "drys"
+                       _                   -> "drü"
             )
           , (4, const "vier")
           , (5, const "füf")
-          , (6, \c → case c of
-                       CtxMul _ (Lit 10) _ → "sëch"
-                       _                   → "sächs"
+          , (6, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "sëch"
+                       _                   -> "sächs"
             )
-          , (7, \c → case c of
-                       CtxAdd _ (_ `Mul` Lit 10) _ → "siben"
-                       _                           → "sibe"
+          , (7, \c -> case c of
+                       CtxAdd _ (_ `Mul` Lit 10) _ -> "siben"
+                       _                           -> "sibe"
             )
-          , (8, \c → case c of
-                       CtxMul _ (Lit 10) _ → "ach"
-                       _                   → "acht"
+          , (8, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "ach"
+                       _                   -> "acht"
             )
-          , (9, \c → case c of
-                       CtxAdd _ (_ `Mul` Lit 10) _ → "nün"
-                       _                           → "nüün"
+          , (9, \c -> case c of
+                       CtxAdd _ (_ `Mul` Lit 10) _ -> "nün"
+                       _                           -> "nüün"
             )
-          , (10, \c → case c of
-                        CtxMul _ (Lit 3) _ → "sg"
-                        CtxMul {}          → "zg"
-                        _                  → "zäh"
+          , (10, \c -> case c of
+                        CtxMul _ (Lit 3) _ -> "sg"
+                        CtxMul {}          -> "zg"
+                        _                  -> "zäh"
             )
           , (11, const "euf")
           , (12, const "zwüof")
diff --git a/src/Text/Numeral/Language/GV.hs b/src/Text/Numeral/Language/GV.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/GV.hs
+++ /dev/null
@@ -1,123 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        gv
-
-[@ISO639-2@]        glv
-
-[@ISO639-3@]        glv
-
-[@Native name@]     Gaelg
-
-[@English name@]    Manx
--}
-
-module Text.Numeral.Language.GV
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
--------------------------------------------------------------------------------
--- GV
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "gv"
-    , entIso639_2    = ["glv"]
-    , entIso639_3    = Just "glv"
-    , entNativeNames = ["Gaelg"]
-    , entEnglishName = Just "Manx"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
-struct = checkPos
-       $ fix
-       $ findRule (   1, lit       )
-                [ (  11, add 10 L  )
-                , (  20, lit       )
-                , (  21, add 20 L  )
-                , (  40, lit       )
-                , (  41, add 40 L  )
-                , (  60, mul 20 R L)
-                , ( 100, step 100 10 R L)
-                , (1000, lit)
-                ]
-                   1000
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = (1, 1000)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just $ \_ _ _ → " "
-               }
-    where
-      ((Lit _ `Mul` Lit 20) ⊞ Lit 10) _ = " as "
-      (_                    ⊞ Lit 10) _ = "-"
-      (_                    ⊞ _     ) _ = " as "
-
-      syms =
-          M.fromList
-          [ (1, const "nane")
-          , (2, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "daa"
-                       CtxMul {}           → "daa"
-                       _                   → "jees"
-            )
-          , (3, const "tree")
-          , (4, const "kiare")
-          , (5, const "queig")
-          , (6, const "shey")
-          , (7, const "shiaght")
-          , (8, const "hoght")
-          , (9, const "nuy")
-          , (10, \c → case c of
-                        CtxAdd _ (Lit 2)              _ → "yeig"
-                        CtxAdd _ (Lit _ `Mul` Lit 20) _ → "jeih"
-                        CtxAdd R _                    _ → "jeig"
-                        _                               → "jeih"
-            )
-          , (20, const "feed")
-          , (40, const "daeed")
-          , (100, \c → case c of
-                         CtxMul {} → "cheead"
-                         _         → "keead"
-            )
-          , (1000, const "thousane")
-          ]
diff --git a/src/Text/Numeral/Language/HE.hs b/src/Text/Numeral/Language/HE.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/HE.hs
+++ /dev/null
@@ -1,172 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        he
-
-[@ISO639-2@]        heb
-
-[@ISO639-3@]        heb
-
-[@Native name@]     עִבְרִית
-
-[@English name@]    Modern Hebrew
--}
-
-module Text.Numeral.Language.HE
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($), fix )
-import "base" Data.List     ( concat )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (+), div, negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- HE
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1       = Just "he"
-    , entIso639_2       = ["heb"]
-    , entIso639_3       = Just "heb"
-    , entNativeNames    = ["עִבְרִית"]
-    , entEnglishName    = Just "Modern Hebrew"
-    , entCardinal       = Just Conversion
-                          { toNumeral   = cardinal
-                          , toStructure = struct
-                          }
-    }
-
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ ( Integral α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Dual β, E.Plural β
-         )
-       ⇒ α → β
-struct = pos
-       $ fix
-       $ findRule (  0, lit)
-                  ( [ (11, add 10 L)
-                    , (20, dual ∘ mapRule (`div` 10) lit)
-                    , (21, add 20 R)
-                    ]
-                  ⊕ concat [ [ (n, plural ∘ mapRule (`div` 10) lit)
-                             , (n+1, add n R)
-                             ]
-                           | n ← [20,30..90]
-                           ]
-                  ⊕ [ (100, step 100 10 R L)
-                    , (200, dual ∘ mapRule (`div` 2) lit)
-                    , (201, add 200 R)
-                    , (300, step 100 10 R L)
-                    ]
-                  )
-                  1000
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = 1000 in (negate x, x)
-
--- TODO: Handle inflection, mainly masculine and feminine
--- gender. Maybe get rid of Dual and Plural in the expression language
--- and use grammatical number for that.
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               , reprNeg   = Just $ \_ _ → "מינוס "
-               , reprAddCombine = Just addCombine
-               }
-    where
-      (_        ⊞ Lit 10) _ = "ה"
-      (Dual   _ ⊞ _     ) _ = " ו"
-      (Plural _ ⊞ _     ) _ = " ו"
-      (_        ⊞ _     ) _ = " "
-
-      (_ ⊡ Lit 10) _ = ""
-      (_ ⊡ _     ) _ = " "
-
-      addCombine a x _ y (Lit 10) = x ⊕ " " ⊕ y ⊕ a
-      addCombine a x _ y _        = x ⊕ a ⊕ y
-
-      syms =
-          M.fromList
-          [ (0, \c → case c of
-                       _ → "אפס"
-            )
-          , (1, \c → case c of
-                       _ → "אחת"
-            )
-          , (2, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "שתים"
-                       CtxDual {}          → "עשרים"
-                       _                   → "שתיים"
-            )
-          , (3, \c → case c of
-                       CtxPlural {} → "שלושים"
-                       _            → "שלוש"
-            )
-          , (4, \c → case c of
-                       CtxPlural {} → "ארבעים"
-                       _            → "ארבע"
-            )
-          , (5, \c → case c of
-                       CtxPlural {} → "חמישים"
-                       _            → "חמש"
-            )
-          , (6, \c → case c of
-                       CtxPlural {} → "ששים"
-                       _            → "שש"
-            )
-          , (7, \c → case c of
-                       CtxPlural {} → "שבעים"
-                       _            → "שבע"
-            )
-          , (8, \c → case c of
-                       CtxPlural {} → "שמונים"
-                       _            → "שמונה"
-            )
-          , (9, \c → case c of
-                       CtxPlural {} → "תשעים"
-                       _            → "תשע"
-            )
-          , (10, \c → case c of
-                        CtxMul _ (Lit n) _ | n ≤ 9 → ""
-                        _ → "עשר"
-            )
-          , (100, \c → case c of
-                         CtxDual   {} → "מאתיים"
-                         CtxMul    {} → "מאות"
-                         _            → "מאה"
-            )
-          , (1000, \c → case c of
-                          _ → "אלף"
-            )
-          ]
diff --git a/src/Text/Numeral/Language/HEB.hs b/src/Text/Numeral/Language/HEB.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/HEB.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE FlexibleContexts  #-}
+
+{-|
+[@ISO639-1@]        he
+
+[@ISO639-2@]        heb
+
+[@ISO639-3@]        heb
+
+[@Native name@]     עִבְרִית
+
+[@English name@]    Modern Hebrew
+-}
+
+module Text.Numeral.Language.HEB
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Monoid ( (<>) )
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- HEB
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1       = Just "he"
+    , entIso639_2       = ["heb"]
+    , entIso639_3       = Just "heb"
+    , entNativeNames    = ["עִבְרִית"]
+    , entEnglishName    = Just "Modern Hebrew"
+    , entCardinal       = Just Conversion
+                          { toNumeral   = cardinal
+                          , toStructure = struct
+                          }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = pos
+       $ fix
+       $ findRule (  0, lit)
+                  ( [ (11, add 10 L)
+                    , (20, changeNumber (Just Dual) . mapRule (`div` 10) lit)
+                    , (21, add 20 R)
+                    ]
+                  <> concat [ [ (n, changeNumber (Just Plural) . mapRule (`div` 10) lit)
+                             , (n+1, add n R)
+                             ]
+                           | n <- [20,30..90]
+                           ]
+                  <> [ (100, step 100 10 R L)
+                    , (200, changeNumber (Just Dual) . mapRule (`div` 2) lit)
+                    , (201, add 200 R)
+                    , (300, step 100 10 R L)
+                    ]
+                  )
+                  1000
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = 1000 in (negate x, x)
+
+-- TODO: Handle inflection, mainly masculine and feminine
+-- gender. Maybe get rid of Dual and Plural in the expression language
+-- and use grammatical number for that.
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \i n -> M.lookup n (syms i)
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               , reprNeg   = Just $ \_ _ -> "מינוס "
+               , reprAddCombine = Just addCombine
+               }
+    where
+      (_ ⊞ Lit 10) _ = "ה"
+      (ChangeNumber _ _ ⊞ _) _ = " ו"
+      (_ ⊞ _) _ = " "
+
+      (_ ⊡ Lit 10) _ = ""
+      (_ ⊡ _     ) _ = " "
+
+      addCombine a x _ y (Lit 10) = x <> " " <> y <> a
+      addCombine a x _ y _        = x <> a <> y
+
+      syms inf =
+          M.fromList
+          [ (0, \c -> case c of
+                       _ -> "אפס"
+            )
+          , (1, \c -> case c of
+                       _ -> "אחת"
+            )
+          , (2, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "שתים"
+                       _ | isDual inf    -> "עשרים"
+                         | otherwise       -> "שתיים"
+            )
+          , (3, \c -> case c of
+                       _ | isPlural inf  -> "שלושים"
+                         | otherwise       -> "שלוש"
+            )
+          , (4, \c -> case c of
+                       _ | isPlural inf -> "ארבעים"
+                         | otherwise      -> "ארבע"
+            )
+          , (5, \c -> case c of
+                       _ | isPlural inf -> "חמישים"
+                         | otherwise      -> "חמש"
+            )
+          , (6, \c -> case c of
+                       _ | isPlural inf -> "ששים"
+                         | otherwise      -> "שש"
+            )
+          , (7, \c -> case c of
+                       _ | isPlural inf -> "שבעים"
+                         | otherwise      -> "שבע"
+            )
+          , (8, \c -> case c of
+                       _ | isPlural inf -> "שמונים"
+                         | otherwise      -> "שמונה"
+            )
+          , (9, \c -> case c of
+                       _ | isPlural inf -> "תשעים"
+                         | otherwise      -> "תשע"
+            )
+          , (10, \c -> case c of
+                        CtxMul _ (Lit n) _ | n <= 9 -> ""
+                        _ -> "עשר"
+            )
+          , (100, \c -> case c of
+                         _ | isDual   inf -> "מאתיים"
+                           | isPlural inf -> "מאות"
+                           | otherwise    -> "מאה"
+            )
+          , (1000, \c -> case c of
+                          _ -> "אלף"
+            )
+          ]
diff --git a/src/Text/Numeral/Language/HOP.hs b/src/Text/Numeral/Language/HOP.hs
--- a/src/Text/Numeral/Language/HOP.hs
+++ b/src/Text/Numeral/Language/HOP.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,15 +26,10 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.List.Unicode     ( (∈) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
+import "base" Data.Function ( fix )
+import "base" Data.Monoid   ( (<>) )
 import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp     as E
+import "this" Text.Numeral
 import "this" Text.Numeral.Entry
 import "this" Text.Numeral.Render.Utils ( mulCtx )
 import "text" Data.Text ( Text )
@@ -49,7 +39,7 @@
 -- HOP
 --------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_3    = Just "hop"
     , entNativeNames = ["Hopilàvayi"]
@@ -60,13 +50,10 @@
                        }
     }
 
-cardinal ∷ (Integral α, E.Scale α)⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ ( Integral α
-         , E.Unknown β, E.Lit β, E.Add β, E.Mul β
-         )
-       ⇒ α → β
+struct :: (Integral a) => a -> Exp
 struct = fix
        $ findRule ( 0, lit)
                 [ (11, add 10 R)
@@ -76,53 +63,53 @@
                 ]
                   (100)
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = (1, 100)
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
+               { reprValue = \inf n -> M.lookup n (syms inf)
                , reprAdd   = Just (⊞)
                , reprAddCombine = Just addCombine
-               , reprMul   = Just $ \_ _ _ → " "
+               , reprMul   = Just $ \_ _ _ -> " "
                }
     where
-      (Lit n          ⊞ _) _ | n ∈ [10, 20] = " niikyang "
-      (Mul _ (Lit 10) ⊞ _) _                = " niikyang "
-      (_              ⊞ _) _                = " "
+      (Lit n          ⊞ _) _ | n `elem` [10, 20] = " niikyang "
+      (Mul _ (Lit 10) ⊞ _) _                     = " niikyang "
+      (_              ⊞ _) _                     = " "
 
-      addCombine a x (Lit n) y _ | n ∈ [10, 20] = x ⊕ a ⊕ y ⊕ " siikya’ta"
-      addCombine a x (Mul _ (Lit 10)) y _       = x ⊕ a ⊕ y ⊕ " siikya’ta"
-      addCombine a x _                y _       = x ⊕ a ⊕ y
+      addCombine a x (Lit n) y _ | n `elem` [10, 20] = x <> a <> y <> " siikya’ta"
+      addCombine a x (Mul _ (Lit 10)) y _            = x <> a <> y <> " siikya’ta"
+      addCombine a x _                y _            = x <> a <> y
 
       syms _ =
           M.fromList
-          [ (1, \c → case c of
-                       CtxAdd {} → "suk"
-                       _         → "suukya’"
+          [ (1, \c -> case c of
+                       CtxAdd {} -> "suk"
+                       _         -> "suukya’"
             )
-          , (2, \c → case c of
-                       CtxAdd {} → "löqmuy"
-                       _         → "lööyöm"
+          , (2, \c -> case c of
+                       CtxAdd {} -> "löqmuy"
+                       _         -> "lööyöm"
             )
-          , (3, \c → case c of
-                       CtxAdd {} → "paykomuy"
-                       CtxMul {} → "payiv"
-                       _         → "pàayom"
+          , (3, \c -> case c of
+                       CtxAdd {} -> "paykomuy"
+                       CtxMul {} -> "payiv"
+                       _         -> "pàayom"
             )
-          , (4, \c → case c of
-                       CtxAdd {} → "naalöqmuy"
-                       CtxMul {} → "naalöv"
-                       _         → "naalöyöm"
+          , (4, \c -> case c of
+                       CtxAdd {} -> "naalöqmuy"
+                       CtxMul {} -> "naalöv"
+                       _         -> "naalöyöm"
             )
           , (5, mulCtx 10 "tsivotsikiv"  $ const "tsivot")
           , (6, mulCtx 10 "navaysikiv"   $ const "navay")
           , (7, mulCtx 10 "tsange’sikiv" $ const "tsange’")
           , (8, mulCtx 10 "nanalsikiv"   $ const "nanalt")
           , (9, mulCtx 10 "peve’sikiv"   $ const "pevt")
-          , (10, \c → case c of
-                       CtxMul L _ _ → "palotsikiv"
-                       _            → "pakwt"
+          , (10, \c -> case c of
+                       CtxMul L _ _ -> "palotsikiv"
+                       _            -> "pakwt"
             )
           , (20, const "sunat")
           ]
diff --git a/src/Text/Numeral/Language/IT.hs b/src/Text/Numeral/Language/IT.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/IT.hs
+++ /dev/null
@@ -1,272 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        it
-
-[@ISO639-2B@]       ita
-
-[@ISO639-3@]        ita
-
-[@Native name@]     Italiano
-
-[@English name@]    Italian
--}
-
-module Text.Numeral.Language.IT
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-    , ordinal
-      -- * Structure
-    , struct
-    , rule
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( Ord )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.List.Unicode     ( (∈) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≥) )
-import "base-unicode-symbols" Prelude.Unicode       ( ℤ )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum  as BN
-import qualified "this" Text.Numeral.Exp     as E
-import qualified "this" Text.Numeral.Grammar as G
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- IT
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1       = Just "it"
-    , entIso639_2       = ["ita"]
-    , entIso639_3       = Just "ita"
-    , entNativeNames    = ["Italiano"]
-    , entEnglishName    = Just "Italian"
-    , entCardinal       = Just Conversion
-                          { toNumeral   = cardinal
-                          , toStructure = struct
-                          }
-    , entOrdinal        = Just Conversion
-                          { toNumeral   = ordinal
-                          , toStructure = struct
-                          }
-    }
-
-cardinal ∷ (G.Masculine i, G.Feminine i, Integral α, E.Scale α)
-         ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-ordinal ∷ (G.Masculine i, G.Feminine i, Integral α, E.Scale α)
-        ⇒ i → α → Maybe Text
-ordinal inf = ordinalRepr inf ∘ struct
-
-rule ∷ ( Integral α, Ord α
-       , E.Unknown β, E.Lit β, E.Add β, E.Mul β
-       )
-     ⇒ Rule α β
-rule = findRule (   0, lit         )
-              [ (  11, add   10 L  )
-              , (  17, add   10 R  )
-              , (  20, lit         )
-              , (  21, add   20 R  )
-              , (  30, mul   10 R L)
-              , ( 100, step  100   10 R L)
-              , (1000, step 1000 1000 R L)
-              ]
-                (dec 6 - 1)
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         )
-       ⇒ α → β
-struct = pos $ fix $ rule `combine` pelletierScale R L BN.rule
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-genericRepr ∷ Repr i
-genericRepr = defaultRepr
-              { reprAdd   = Just (⊞)
-              , reprMul   = Just (⊡)
-              , reprNeg   = Just $ \_ _ → "meno "
-              }
-    where
-      (Lit 10                ⊞ Lit 7) _ = "as"
-      (Lit 10                ⊞ Lit 9) _ = "an"
-      ((_ `Mul` Scale _ _ _) ⊞ _    ) _ = " "
-      (_                     ⊞ _    ) _ = ""
-
-
-      (Lit n ⊡ Lit 10) _ | n ≥ 4 = "an"
-      (_     ⊡ Scale _ _ _) _ = " "
-      (_     ⊡ _          ) _ = ""
-
-cardinalRepr ∷ (G.Feminine i, G.Masculine i) ⇒ i → Exp i → Maybe Text
-cardinalRepr = render genericRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
-               , reprScale = BN.pelletierRepr
-                               (BN.quantityName "ilione"  "ilioni")
-                               (BN.quantityName "iliardo" "iliardi")
-                               bigNumSyms
-               }
-    where
-      syms inf =
-          M.fromList
-          [ (0, const "zero")
-          , (1, \c → case c of
-                       CtxAdd _ (Lit 10) _   → "un"
-                       _ | G.isFeminine  inf → "una"
-                         | G.isMasculine inf → "un"
-                         | otherwise         → "uno"
-            )
-          , (2, forms "due" "do" "du")
-          , (3, \c → case c of
-                       CtxAdd R _        _ → "tré"
-                       CtxMul _ (Lit 10) _ → "tren"
-                       _                   → "tre"
-            )
-          , (4, forms "quattro" "quattor" "quar")
-          , (5, forms "cinque"  "quin"    "cinqu")
-          , (6, forms "sei"     "se"      "sess")
-          , (7, forms "sette"   "sette"   "sett")
-          , (8, forms "otto"    "otto"    "ott")
-          , (9, forms "nove"    "nove"    "nov")
-          , (10, \c → case c of
-                        CtxAdd _ (Lit _) _ → "dici"
-                        -- Last vowel removed because of a phonetic rule:
-                        CtxMul _ (Lit _) (CtxAdd _ (Lit n) _)
-                            | n ∈ [1,8]    → "t"
-                        CtxMul R (Lit _) _ → "ta"
-                        _                  → "dieci"
-            )
-          , (20, \c → case c of
-                        CtxAdd _ (Lit n) _
-                            | n ∈ [1,8]   → "vent"
-                        _                 → "venti"
-            )
-          , ( 100
-            , let f c = case c of
-                          CtxAdd _ (Lit 8)                      _  → "cent"
-                          CtxAdd _ (Lit 8 `Mul` Lit 10)         _  → "cent"
-                          CtxAdd _ (Lit 8 `Mul` Lit 10 `Add` _) _  → "cent"
-                          CtxMul _ (Lit _) c2 → f c2
-                          _ → "cento"
-              in f
-            )
-          , (1000, \c → case c of
-                          CtxMul {} → "mila"
-                          _         → "mille"
-            )
-          ]
-
-      forms ∷ s → s → s → Ctx (Exp i) → s
-      forms n a m c = case c of
-                        CtxAdd _ (Lit 10) _ → a
-                        CtxMul _ (Lit 10) _ → m
-                        _                   → n
-
-ordinalRepr ∷ (G.Feminine i) ⇒ i → Exp i → Maybe Text
-ordinalRepr = render genericRepr
-              { reprValue = \inf n → M.lookup n (syms inf)
-              , reprScale = BN.pelletierRepr
-                              ( BN.ordQuantityName "ilione" "ilionesimo"
-                                                   "ilioni" "ilionesimo"
-                              )
-                              ( BN.ordQuantityName "iliardo" "iliardesimo"
-                                                   "iliardi" "iliardesimo"
-                              )
-                              bigNumSyms
-              }
-    where
-      syms inf =
-          M.fromList
-          [ (0, const "zero")
-          , (1, forms "prima" "primo" "unesimo" "uno" "un" "un")
-          , (2, forms "seconda" "secondo" "duesimo" "due" "do" "due")
-          , (3, \c → case c of
-                       CtxEmpty
-                         | G.isFeminine inf → "terza"
-                         | otherwise        → "terzo"
-                       _ | isOutside R c    → "treesimo"
-                       CtxAdd R _        _  → "tré"
-                       CtxMul _ (Lit 10) _  → "tren"
-                       _                    → "tre"
-            )
-          , (4, forms "quarta"  "quarto"  "quattresimo" "quattro" "quattor" "quar")
-          , (5, forms "quinta"  "quinto"  "cinquesimo"  "cinque"  "quin"    "cinqu")
-          , (6, forms "sesta"   "sesto"   "seiesimo"    "sei"     "se"      "sess")
-          , (7, forms "settimo" "settimo" "settesimo"   "sette"   "sette"   "sett")
-          , (8, forms "ottave"  "ottavo"  "ottesimo"    "otto"    "otto"    "ott")
-          , (9, forms "nono"    "nono"    "novesimo"    "nove"    "nove"    "nov")
-          , (10, \c → case c of
-                        CtxAdd _ (Lit _) _ | isOutside R c → "dicesimo"
-                                           | otherwise     → "dici"
-                        -- Last vowel removed because of a phonetic rule:
-                        CtxMul _ (Lit _) (CtxAdd _ (Lit n) _)
-                            | n ∈ [1,8]                    → "t"
-                        CtxMul R (Lit _) _ | isOutside R c → "tesimo"
-                                           | otherwise     → "ta"
-                        _                  | isOutside R c → "decimo"
-                                           | otherwise     → "dieci"
-            )
-          , (20, \c → case c of
-                        _ | isOutside R c  → "ventesimo"
-                        CtxAdd _ (Lit n) _
-                          | n ∈ [1,8]      → "vent"
-                        _                  → "venti"
-            )
-          , ( 100
-            , let f c = case c of
-                          _ | isOutside R c                        → "centesimo"
-                          CtxAdd _ (Lit 8)                      _  → "cent"
-                          CtxAdd _ (Lit 8 `Mul` Lit 10)         _  → "cent"
-                          CtxAdd _ (Lit 8 `Mul` Lit 10 `Add` _) _  → "cent"
-                          CtxMul _ (Lit _) c2                      → f c2
-                          _                                        → "cento"
-              in f
-            )
-          , (1000, \c → case c of
-                          _ | isOutside R c → "millesimo"
-                          CtxMul {}         → "mila"
-                          _                 → "mille"
-            )
-          ]
-          where
-            forms ∷ s → s → s → s → s → s → Ctx (Exp i) → s
-            forms fo1 o1 o2 n a m c =
-                case c of
-                  CtxEmpty
-                    | G.isFeminine inf → fo1
-                    | otherwise        → o1
-                  _ | isOutside R c    → o2
-                  CtxAdd _ (Lit 10) _  → a
-                  CtxMul _ (Lit 10) _  → m
-                  _                    → n
-
-bigNumSyms ∷ [(ℤ, Ctx (Exp i) → Text)]
-bigNumSyms =
-  [ (6, BN.forms "sest" "sex"    "ses"    "sexa"   "ses")
-  , (7, BN.forms "sett" "septen" "septem" "septua" "septin")
-  , (8, BN.forms "ott"  "otto"   "otto"   "otto"   "ottin")
-  ]
diff --git a/src/Text/Numeral/Language/ITA.hs b/src/Text/Numeral/Language/ITA.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/ITA.hs
@@ -0,0 +1,249 @@
+{-|
+[@ISO639-1@]        it
+
+[@ISO639-2B@]       ita
+
+[@ISO639-3@]        ita
+
+[@Native name@]     Italiano
+
+[@English name@]    Italian
+-}
+
+module Text.Numeral.Language.ITA
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+    , ordinal
+      -- * Structure
+    , struct
+    , rule
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum  as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- ITA
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "it"
+    , entIso639_2    = ["ita"]
+    , entIso639_3    = Just "ita"
+    , entNativeNames = ["Italiano"]
+    , entEnglishName = Just "Italian"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    , entOrdinal     = Just Conversion
+                       { toNumeral   = ordinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+ordinal inf = ordinalRepr inf . struct
+
+rule :: (Integral a) => Rule a
+rule = findRule (   0, lit         )
+              [ (  11, add   10 L  )
+              , (  17, add   10 R  )
+              , (  20, lit         )
+              , (  21, add   20 R  )
+              , (  30, mul   10 R L)
+              , ( 100, step  100   10 R L)
+              , (1000, step 1000 1000 R L)
+              ]
+                (dec 6 - 1)
+
+struct :: (Integral a) => a -> Exp
+struct = pos $ fix $ rule `combine` pelletierScale R L BN.rule
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+genericRepr :: Repr
+genericRepr = defaultRepr
+              { reprAdd   = Just (⊞)
+              , reprMul   = Just (⊡)
+              , reprNeg   = Just $ \_ _ -> "meno "
+              }
+    where
+      (Lit 10                ⊞ Lit 7) _ = "as"
+      (Lit 10                ⊞ Lit 9) _ = "an"
+      ((_ `Mul` Scale _ _ _) ⊞ _    ) _ = " "
+      (_                     ⊞ _    ) _ = ""
+
+
+      (Lit n ⊡ Lit 10) _ | n >= 4 = "an"
+      (_     ⊡ Scale _ _ _) _     = " "
+      (_     ⊡ _          ) _     = ""
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render genericRepr
+               { reprValue = \inf n -> M.lookup n (syms inf)
+               , reprScale = BN.pelletierRepr
+                               (BN.quantityName "ilione"  "ilioni")
+                               (BN.quantityName "iliardo" "iliardi")
+                               bigNumSyms
+               }
+    where
+      syms inf =
+          M.fromList
+          [ (0, const "zero")
+          , (1, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "un"
+                       _ | isFeminine  inf -> "una"
+                         | isMasculine inf -> "un"
+                         | otherwise       -> "uno"
+            )
+          , (2, forms "due" "do" "du")
+          , (3, \c -> case c of
+                       CtxAdd R _        _ -> "tré"
+                       CtxMul _ (Lit 10) _ -> "tren"
+                       _                   -> "tre"
+            )
+          , (4, forms "quattro" "quattor" "quar")
+          , (5, forms "cinque"  "quin"    "cinqu")
+          , (6, forms "sei"     "se"      "sess")
+          , (7, forms "sette"   "sette"   "sett")
+          , (8, forms "otto"    "otto"    "ott")
+          , (9, forms "nove"    "nove"    "nov")
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit _) _ -> "dici"
+                        -- Last vowel removed because of a phonetic rule:
+                        CtxMul _ (Lit _) (CtxAdd _ (Lit n) _)
+                            | n `elem` [1,8] -> "t"
+                        CtxMul R (Lit _) _   -> "ta"
+                        _                    -> "dieci"
+            )
+          , (20, \c -> case c of
+                        CtxAdd _ (Lit n) _
+                            | n `elem` [1,8] -> "vent"
+                        _                   -> "venti"
+            )
+          , ( 100
+            , let f c = case c of
+                          CtxAdd _ (Lit 8)                      _  -> "cent"
+                          CtxAdd _ (Lit 8 `Mul` Lit 10)         _  -> "cent"
+                          CtxAdd _ (Lit 8 `Mul` Lit 10 `Add` _) _  -> "cent"
+                          CtxMul _ (Lit _) c2 -> f c2
+                          _ -> "cento"
+              in f
+            )
+          , (1000, \c -> case c of
+                          CtxMul {} -> "mila"
+                          _         -> "mille"
+            )
+          ]
+
+      forms :: s -> s -> s -> Ctx Exp -> s
+      forms n a m c = case c of
+                        CtxAdd _ (Lit 10) _ -> a
+                        CtxMul _ (Lit 10) _ -> m
+                        _                   -> n
+
+ordinalRepr :: Inflection -> Exp -> Maybe Text
+ordinalRepr = render genericRepr
+              { reprValue = \inf n -> M.lookup n (syms inf)
+              , reprScale = BN.pelletierRepr
+                              ( BN.ordQuantityName "ilione" "ilionesimo"
+                                                   "ilioni" "ilionesimo"
+                              )
+                              ( BN.ordQuantityName "iliardo" "iliardesimo"
+                                                   "iliardi" "iliardesimo"
+                              )
+                              bigNumSyms
+              }
+    where
+      syms inf =
+          M.fromList
+          [ (0, const "zero")
+          , (1, forms "prima" "primo" "unesimo" "uno" "un" "un")
+          , (2, forms "seconda" "secondo" "duesimo" "due" "do" "due")
+          , (3, \c -> case c of
+                       CtxEmpty
+                         | isFeminine inf  -> "terza"
+                         | otherwise       -> "terzo"
+                       _ | isOutside R c   -> "treesimo"
+                       CtxAdd R _        _ -> "tré"
+                       CtxMul _ (Lit 10) _ -> "tren"
+                       _                   -> "tre"
+            )
+          , (4, forms "quarta"  "quarto"  "quattresimo" "quattro" "quattor" "quar")
+          , (5, forms "quinta"  "quinto"  "cinquesimo"  "cinque"  "quin"    "cinqu")
+          , (6, forms "sesta"   "sesto"   "seiesimo"    "sei"     "se"      "sess")
+          , (7, forms "settimo" "settimo" "settesimo"   "sette"   "sette"   "sett")
+          , (8, forms "ottave"  "ottavo"  "ottesimo"    "otto"    "otto"    "ott")
+          , (9, forms "nono"    "nono"    "novesimo"    "nove"    "nove"    "nov")
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit _) _ | isOutside R c -> "dicesimo"
+                                           | otherwise     -> "dici"
+                        -- Last vowel removed because of a phonetic rule:
+                        CtxMul _ (Lit _) (CtxAdd _ (Lit n) _)
+                            | n `elem` [1,8]               -> "t"
+                        CtxMul R (Lit _) _ | isOutside R c -> "tesimo"
+                                           | otherwise     -> "ta"
+                        _                  | isOutside R c -> "decimo"
+                                           | otherwise     -> "dieci"
+            )
+          , (20, \c -> case c of
+                        _ | isOutside R c  -> "ventesimo"
+                        CtxAdd _ (Lit n) _
+                          | n `elem` [1,8] -> "vent"
+                        _                  -> "venti"
+            )
+          , ( 100
+            , let f c = case c of
+                          _ | isOutside R c                        -> "centesimo"
+                          CtxAdd _ (Lit 8)                      _  -> "cent"
+                          CtxAdd _ (Lit 8 `Mul` Lit 10)         _  -> "cent"
+                          CtxAdd _ (Lit 8 `Mul` Lit 10 `Add` _) _  -> "cent"
+                          CtxMul _ (Lit _) c2                      -> f c2
+                          _                                        -> "cento"
+              in f
+            )
+          , (1000, \c -> case c of
+                          _ | isOutside R c -> "millesimo"
+                          CtxMul {}         -> "mila"
+                          _                 -> "mille"
+            )
+          ]
+          where
+            forms :: s -> s -> s -> s -> s -> s -> Ctx Exp -> s
+            forms fo1 o1 o2 n a m c =
+                case c of
+                  CtxEmpty
+                    | isFeminine inf  -> fo1
+                    | otherwise       -> o1
+                  _ | isOutside R c   -> o2
+                  CtxAdd _ (Lit 10) _ -> a
+                  CtxMul _ (Lit 10) _ -> m
+                  _                   -> n
+
+bigNumSyms :: [(Integer, Ctx Exp -> Text)]
+bigNumSyms =
+  [ (6, BN.forms "sest" "sex"    "ses"    "sexa"   "ses")
+  , (7, BN.forms "sett" "septen" "septem" "septua" "septin")
+  , (8, BN.forms "ott"  "otto"   "otto"   "otto"   "ottin")
+  ]
diff --git a/src/Text/Numeral/Language/JA.hs b/src/Text/Numeral/Language/JA.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/JA.hs
+++ /dev/null
@@ -1,278 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        ja
-
-[@ISO639-2B@]       jpn
-
-[@ISO639-3@]        jpn
-
-[@Native name@]     日本語
-
-[@English name@]    Japanese
--}
-
-module Text.Numeral.Language.JA
-    ( -- * Language entry
-      kanji_entry
-    , daiji_entry
-    , on'yomi_entry
-    , preferred_entry
-      -- * Conversions
-    , kanji_cardinal
-    , daiji_cardinal
-    , on'yomi_cardinal
-    , preferred_cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    , daiji_bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.List     ( map )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Num, Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc  ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- JA
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1       = Just "ja"
-    , entIso639_2       = ["jpn"]
-    , entIso639_3       = Just "jpn"
-    , entNativeNames    = ["日本語"]
-    , entEnglishName    = Just "Japanese"
-    }
-
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β) ⇒ α → β
-struct = pos
-       $ fix
-       $ findRule (   0, lit             )
-              ( [ (  11, add    10    R  )
-                , (  20, mul    10    R L)
-                , ( 100, step  100 10 R L)
-                , (1000, step 1000 10 R L)
-                ]
-              ⊕ [ (n, step1 n (dec 4) R L) | n ← map dec [4,8..68] ]
-              )
-             (dec 72 - 1)
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 72 - 1 in (negate x, x)
-
-daiji_bounds ∷ (Integral α) ⇒ (α, α)
-daiji_bounds = let x = dec 4 - 1 in (negate x, x)
-
-
---------------------------------------------------------------------------------
--- Kanji
---------------------------------------------------------------------------------
-
-kanji_entry ∷ Entry
-kanji_entry = entry
-    { entVariant  = Just "kanji"
-    , entCardinal = Just Conversion
-                    { toNumeral   = kanji_cardinal
-                    , toStructure = struct
-                    }
-    }
-
-kanji_cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-kanji_cardinal inf = kanji_cardinal_repr inf ∘ struct
-
-kanji_cardinal_repr ∷ i → Exp i → Maybe Text
-kanji_cardinal_repr = render defaultRepr
-                      { reprValue = \_ n → M.lookup n syms
-                      , reprAdd   = Just $ \_ _ _ → ""
-                      , reprMul   = Just $ \_ _ _ → ""
-                      , reprNeg   = Just $ \_ _   → "マイナス"
-                      }
-    where
-      syms =
-          M.fromList
-          [ (0, const "零") -- alternatives:"ゼロ" or "マル"
-          , (1, const "一")
-          , (2, const "二")
-          , (3, const "三")
-          , (4, const "四")
-          , (5, const "五")
-          , (6, const "六")
-          , (7, const "七")
-          , (8, const "八")
-          , (9, const "九")
-          , (10, const "十")
-          , (100, const "百")
-          , (dec 3, const "千")
-          , (dec 4, const "万")
-          , (dec 8, const "億")
-          , (dec 12, const "兆")
-          , (dec 16, const "京")
-          , (dec 20, const "垓")
-          , (dec 24, const "𥝱") -- or 秭?
-          , (dec 28, const "穣")
-          , (dec 32, const "溝")
-          , (dec 36, const "澗")
-          , (dec 40, const "正")
-          , (dec 44, const "載")
-          , (dec 48, const "極")
-          , (dec 52, const "恒河沙")
-          , (dec 56, const "阿僧祇")
-          , (dec 60, const "那由他/那由多")
-          , (dec 64, const "不可思議")
-          , (dec 68, const "無量大数")
-          ]
-
-
---------------------------------------------------------------------------------
--- Daiji
---------------------------------------------------------------------------------
-
-daiji_entry ∷ Entry
-daiji_entry = entry
-    { entVariant  = Just "daiji"
-    , entCardinal = Just Conversion
-                    { toNumeral   = daiji_cardinal
-                    , toStructure = struct
-                    }
-    }
-
-daiji_cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-daiji_cardinal inf = daiji_cardinal_repr inf ∘ struct
-
-daiji_cardinal_repr ∷ i → Exp i → Maybe Text
-daiji_cardinal_repr = render defaultRepr
-                      { reprValue = \_ n → M.lookup n syms
-                      , reprAdd   = Just $ \_ _ _ → ""
-                      , reprMul   = Just $ \_ _ _ → ""
-                      , reprNeg   = Just $ \_ _   → "マイナス"
-                      }
-    where
-      syms =
-          M.fromList
-          [ (0, const "零") -- alternatives:"ゼロ" or "マル"
-          , (1, const "壱")
-          , (2, const "弐")
-          , (3, const "参")
-          , (4, const "四")
-          , (5, const "五")
-          , (6, const "六")
-          , (7, const "七")
-          , (8, const "八")
-          , (9, const "九")
-          , (10, const "拾")
-          , (100, const "百")
-          , (dec 3, const "千")
-          , (dec 4, const "万")
-          ]
-
-
---------------------------------------------------------------------------------
--- Generic reading
---------------------------------------------------------------------------------
-
-generic_repr ∷ Text → Text → Repr i
-generic_repr four seven = defaultRepr
-                          { reprValue = \_ n → M.lookup n syms
-                          , reprAdd   = Just $ \_ _ _ → " "
-                          , reprMul   = Just $ \_ _ _ → ""
-                          , reprNeg   = Just $ \_ _   → "mainasu "
-                          }
-    where
-      syms =
-          M.fromList
-          [ (0, const "rei")
-          , (1, const "ichi")
-          , (2, const "ni")
-          , (3, const "san")
-          , (4, const four)
-          , (5, const "go")
-          , (6, const "roku")
-          , (7, const seven)
-          , (8, const "hachi")
-          , (9, const "kyū")
-          , (10, const "jū")
-          , (100, \c → case c of
-                         (CtxMul _ (Lit 3) _) → "byaku" -- rendaku
-                         _                    → "hyaku"
-            )
-          , (dec 3, const "sen")
-          , (dec 4, const "man")
-          , (dec 8, const "oku")
-          , (dec 12, const "chō")
-          , (dec 16, const "kei")
-          , (dec 20, const "gai")
-          , (dec 24, const "jo")
-          , (dec 28, const "jō")
-          , (dec 32, const "kō")
-          , (dec 36, const "kan")
-          , (dec 40, const "sei")
-          , (dec 44, const "sai")
-          , (dec 48, const "goku")
-          , (dec 52, const "gōgasha")
-          , (dec 56, const "asōgi")
-          , (dec 60, const "nayuta")
-          , (dec 64, const "fukashigi")
-          , (dec 68, const "muryōtaisū")
-          ]
-
-
---------------------------------------------------------------------------------
--- On'yomi
---------------------------------------------------------------------------------
-
-on'yomi_entry ∷ Entry
-on'yomi_entry = entry
-    { entVariant  = Just "on'yomi"
-    , entCardinal = Just Conversion
-                    { toNumeral   = on'yomi_cardinal
-                    , toStructure = struct
-                    }
-    }
-
-on'yomi_cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-on'yomi_cardinal inf = on'yomi_cardinal_repr inf ∘ struct
-
-on'yomi_cardinal_repr ∷ i → Exp i → Maybe Text
-on'yomi_cardinal_repr = render (generic_repr "shi" "shichi")
-
-
---------------------------------------------------------------------------------
--- Preferred reading
---------------------------------------------------------------------------------
-
-preferred_entry ∷ Entry
-preferred_entry = entry
-    { entVariant  = Just "preferred"
-    , entCardinal = Just Conversion
-                    { toNumeral   = preferred_cardinal
-                    , toStructure = struct
-                    }
-    }
-
-preferred_cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-preferred_cardinal inf = preferred_cardinal_repr inf ∘ struct
-
-preferred_cardinal_repr ∷ i → Exp i → Maybe Text
-preferred_cardinal_repr = render (generic_repr "yon" "nana")
diff --git a/src/Text/Numeral/Language/JPN.hs b/src/Text/Numeral/Language/JPN.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/JPN.hs
@@ -0,0 +1,267 @@
+{-|
+[@ISO639-1@]        ja
+
+[@ISO639-2B@]       jpn
+
+[@ISO639-3@]        jpn
+
+[@Native name@]     日本語
+
+[@English name@]    Japanese
+-}
+
+module Text.Numeral.Language.JPN
+    ( -- * Language entry
+      kanji_entry
+    , daiji_entry
+    , on'yomi_entry
+    , preferred_entry
+      -- * Conversions
+    , kanji_cardinal
+    , daiji_cardinal
+    , on'yomi_cardinal
+    , preferred_cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    , daiji_bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Monoid ( (<>) )
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Misc  ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- JPN
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1       = Just "ja"
+    , entIso639_2       = ["jpn"]
+    , entIso639_3       = Just "jpn"
+    , entNativeNames    = ["日本語"]
+    , entEnglishName    = Just "Japanese"
+    }
+
+struct :: (Integral a) => a -> Exp
+struct = pos
+       $ fix
+       $ findRule (   0, lit             )
+              ( [ (  11, add    10    R  )
+                , (  20, mul    10    R L)
+                , ( 100, step  100 10 R L)
+                , (1000, step 1000 10 R L)
+                ]
+              <> [ (n, step1 n (dec 4) R L) | n <- map dec [4,8..68] ]
+              )
+             (dec 72 - 1)
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 72 - 1 in (negate x, x)
+
+daiji_bounds :: (Integral a) => (a, a)
+daiji_bounds = let x = dec 4 - 1 in (negate x, x)
+
+
+--------------------------------------------------------------------------------
+-- Kanji
+--------------------------------------------------------------------------------
+
+kanji_entry :: Entry
+kanji_entry = entry
+    { entVariant  = Just "kanji"
+    , entCardinal = Just Conversion
+                    { toNumeral   = kanji_cardinal
+                    , toStructure = struct
+                    }
+    }
+
+kanji_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+kanji_cardinal inf = kanji_cardinal_repr inf . struct
+
+kanji_cardinal_repr :: Inflection -> Exp -> Maybe Text
+kanji_cardinal_repr = render defaultRepr
+                      { reprValue = \_ n -> M.lookup n syms
+                      , reprAdd   = Just $ \_ _ _ -> ""
+                      , reprMul   = Just $ \_ _ _ -> ""
+                      , reprNeg   = Just $ \_ _   -> "マイナス"
+                      }
+    where
+      syms =
+          M.fromList
+          [ (0, const "零") -- alternatives:"ゼロ" or "マル"
+          , (1, const "一")
+          , (2, const "二")
+          , (3, const "三")
+          , (4, const "四")
+          , (5, const "五")
+          , (6, const "六")
+          , (7, const "七")
+          , (8, const "八")
+          , (9, const "九")
+          , (10, const "十")
+          , (100, const "百")
+          , (dec 3, const "千")
+          , (dec 4, const "万")
+          , (dec 8, const "億")
+          , (dec 12, const "兆")
+          , (dec 16, const "京")
+          , (dec 20, const "垓")
+          , (dec 24, const "𥝱") -- or 秭?
+          , (dec 28, const "穣")
+          , (dec 32, const "溝")
+          , (dec 36, const "澗")
+          , (dec 40, const "正")
+          , (dec 44, const "載")
+          , (dec 48, const "極")
+          , (dec 52, const "恒河沙")
+          , (dec 56, const "阿僧祇")
+          , (dec 60, const "那由他/那由多")
+          , (dec 64, const "不可思議")
+          , (dec 68, const "無量大数")
+          ]
+
+
+--------------------------------------------------------------------------------
+-- Daiji
+--------------------------------------------------------------------------------
+
+daiji_entry :: Entry
+daiji_entry = entry
+    { entVariant  = Just "daiji"
+    , entCardinal = Just Conversion
+                    { toNumeral   = daiji_cardinal
+                    , toStructure = struct
+                    }
+    }
+
+daiji_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+daiji_cardinal inf = daiji_cardinal_repr inf . struct
+
+daiji_cardinal_repr :: Inflection -> Exp -> Maybe Text
+daiji_cardinal_repr = render defaultRepr
+                      { reprValue = \_ n -> M.lookup n syms
+                      , reprAdd   = Just $ \_ _ _ -> ""
+                      , reprMul   = Just $ \_ _ _ -> ""
+                      , reprNeg   = Just $ \_ _   -> "マイナス"
+                      }
+    where
+      syms =
+          M.fromList
+          [ (0, const "零") -- alternatives:"ゼロ" or "マル"
+          , (1, const "壱")
+          , (2, const "弐")
+          , (3, const "参")
+          , (4, const "四")
+          , (5, const "五")
+          , (6, const "六")
+          , (7, const "七")
+          , (8, const "八")
+          , (9, const "九")
+          , (10, const "拾")
+          , (100, const "百")
+          , (dec 3, const "千")
+          , (dec 4, const "万")
+          ]
+
+
+--------------------------------------------------------------------------------
+-- Generic reading
+--------------------------------------------------------------------------------
+
+generic_repr :: Text -> Text -> Repr
+generic_repr four seven = defaultRepr
+                          { reprValue = \_ n -> M.lookup n syms
+                          , reprAdd   = Just $ \_ _ _ -> " "
+                          , reprMul   = Just $ \_ _ _ -> ""
+                          , reprNeg   = Just $ \_ _   -> "mainasu "
+                          }
+    where
+      syms =
+          M.fromList
+          [ (0, const "rei")
+          , (1, const "ichi")
+          , (2, const "ni")
+          , (3, const "san")
+          , (4, const four)
+          , (5, const "go")
+          , (6, const "roku")
+          , (7, const seven)
+          , (8, const "hachi")
+          , (9, const "kyū")
+          , (10, const "jū")
+          , (100, \c -> case c of
+                         (CtxMul _ (Lit 3) _) -> "byaku" -- rendaku
+                         _                    -> "hyaku"
+            )
+          , (dec 3, const "sen")
+          , (dec 4, const "man")
+          , (dec 8, const "oku")
+          , (dec 12, const "chō")
+          , (dec 16, const "kei")
+          , (dec 20, const "gai")
+          , (dec 24, const "jo")
+          , (dec 28, const "jō")
+          , (dec 32, const "kō")
+          , (dec 36, const "kan")
+          , (dec 40, const "sei")
+          , (dec 44, const "sai")
+          , (dec 48, const "goku")
+          , (dec 52, const "gōgasha")
+          , (dec 56, const "asōgi")
+          , (dec 60, const "nayuta")
+          , (dec 64, const "fukashigi")
+          , (dec 68, const "muryōtaisū")
+          ]
+
+
+--------------------------------------------------------------------------------
+-- On'yomi
+--------------------------------------------------------------------------------
+
+on'yomi_entry :: Entry
+on'yomi_entry = entry
+    { entVariant  = Just "on'yomi"
+    , entCardinal = Just Conversion
+                    { toNumeral   = on'yomi_cardinal
+                    , toStructure = struct
+                    }
+    }
+
+on'yomi_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+on'yomi_cardinal inf = on'yomi_cardinal_repr inf . struct
+
+on'yomi_cardinal_repr :: Inflection -> Exp -> Maybe Text
+on'yomi_cardinal_repr = render (generic_repr "shi" "shichi")
+
+
+--------------------------------------------------------------------------------
+-- Preferred reading
+--------------------------------------------------------------------------------
+
+preferred_entry :: Entry
+preferred_entry = entry
+    { entVariant  = Just "preferred"
+    , entCardinal = Just Conversion
+                    { toNumeral   = preferred_cardinal
+                    , toStructure = struct
+                    }
+    }
+
+preferred_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+preferred_cardinal inf = preferred_cardinal_repr inf . struct
+
+preferred_cardinal_repr :: Inflection -> Exp -> Maybe Text
+preferred_cardinal_repr = render (generic_repr "yon" "nana")
diff --git a/src/Text/Numeral/Language/LA.hs b/src/Text/Numeral/Language/LA.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/LA.hs
+++ /dev/null
@@ -1,174 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        la
-
-[@ISO639-2B@]       lat
-
-[@ISO639-3@]        lat
-
-[@Native name@]     Latine
-
-[@English name@]    Latin
--}
-
-module Text.Numeral.Language.LA
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.List     ( concat )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, Num, (+) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.List.Unicode     ( (∈) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- LA
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "la"
-    , entIso639_2    = ["lat"]
-    , entIso639_3    = Just "lat"
-    , entNativeNames = ["Latine"]
-    , entEnglishName = Just "Latin"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Sub β, E.Mul β) ⇒ α → β
-struct = checkPos
-       $ fix
-       $ findRule ( 0, lit)
-                  ( [ (11, add 10 L)
-                    , (18, sub 20)
-                    ]
-                  ⊕ concat [ [ (n,   mul 10 R L)
-                             , (n+8, sub $ n+10)
-                             ]
-                           | n ← [20,30..90]
-                           ]
-                  ⊕ [ ( 100, step 100 10 R L)
-                    , (1000, lit)
-                    ]
-                  )
-                  1000
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = (0, 1000)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               , reprSub   = Just $ \_ _ _ → "dē"
-               , reprNeg   = Just $ \_ _   → "minus "
-               }
-    where
-      ((_ `Mul` Lit _) ⊞ _) _ = " "
-      (_               ⊞ _) _ = ""
-
-      (_ ⊡ Lit n) _ | n ≤ 100 = ""
-      (_ ⊡ _    ) _           = " "
-
-      syms =
-          M.fromList
-          [ (0, const "nihil")
-          , (1, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "ūn"
-                       CtxSub _ _         _ → "ūn"
-                       _                    → "ūnus"
-            )
-          , (2, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "vī"
-                       CtxMul _ (Lit 100) _ → "du"
-                       _                    → "duo"
-            )
-          , (3, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "trē"
-                       CtxMul _ (Lit 10)  _ → "trī"
-                       CtxMul _ (Lit 100) _ → "tre"
-                       _                    → "trēs"
-            )
-          , (4, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "quadrā"
-                       CtxMul _ (Lit 100) _ → "quadrin"
-                       _                    → "quattuor"
-            )
-          , (5, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "quīn"
-                       CtxMul _ (Lit 10)  _ → "quīnquā"
-                       CtxMul _ (Lit 100) _ → "quīn"
-                       _                    → "quīnque"
-            )
-          , (6, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "sē"
-                       CtxMul _ (Lit 10)  _ → "sexā"
-                       CtxMul _ (Lit 100) _ → "ses"
-                       _                    → "sex"
-            )
-          , (7, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "septen"
-                       CtxMul _ (Lit 10)  _ → "septuā"
-                       CtxMul _ (Lit 100) _ → "septin"
-                       _                    → "septem"
-            )
-          , (8, \c → case c of
-                       CtxMul _ (Lit 100) _ → "octin"
-                       _                    → "octō"
-            )
-          , (9, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "nōnā"
-                       CtxMul _ (Lit 100) _ → "nōn"
-                       _                    → "novem"
-            )
-          , (10, \c → case c of
-                        CtxAdd {}           → "decim"
-                        CtxMul _ (Lit 2)  _ → "gintī"
-                        CtxMul {}           → "gintā"
-                        _                   → "decem"
-            )
-          , (100, \c → case c of
-                         CtxMul _ (Lit n) _
-                             | n ∈ [2,3,6] → "centī"
-                             | otherwise   → "gentī"
-                         _                 → "centum"
-            )
-          , (1000, \c → case c of
-                          CtxMul {} → "milia"
-                          _         → "mīlle"
-            )
-          ]
diff --git a/src/Text/Numeral/Language/LAT.hs b/src/Text/Numeral/Language/LAT.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/LAT.hs
@@ -0,0 +1,160 @@
+{-|
+[@ISO639-1@]        la
+
+[@ISO639-2B@]       lat
+
+[@ISO639-3@]        lat
+
+[@Native name@]     Latine
+
+[@English name@]    Latin
+-}
+
+module Text.Numeral.Language.LAT
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Monoid ( (<>) )
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- LA
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "la"
+    , entIso639_2    = ["lat"]
+    , entIso639_3    = Just "lat"
+    , entNativeNames = ["Latine"]
+    , entEnglishName = Just "Latin"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = checkPos
+       $ fix
+       $ findRule ( 0, lit)
+                  ( [ (11, add 10 L)
+                    , (18, sub 20)
+                    ]
+                  <> concat [ [ (n,   mul 10 R L)
+                              , (n+8, sub $ n+10)
+                              ]
+                            | n <- [20,30..90]
+                            ]
+                  <> [ ( 100, step 100 10 R L)
+                     , (1000, lit)
+                     ]
+                  )
+                  1000
+
+bounds :: (Integral a) => (a, a)
+bounds = (0, 1000)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               , reprSub   = Just $ \_ _ _ -> "dē"
+               , reprNeg   = Just $ \_ _   -> "minus "
+               }
+    where
+      ((_ `Mul` Lit _) ⊞ _) _ = " "
+      (_               ⊞ _) _ = ""
+
+      (_ ⊡ Lit n) _ | n <= 100 = ""
+      (_ ⊡ _    ) _            = " "
+
+      syms =
+          M.fromList
+          [ (0, const "nihil")
+          , (1, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "ūn"
+                       CtxSub _ _         _ -> "ūn"
+                       _                    -> "ūnus"
+            )
+          , (2, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "vī"
+                       CtxMul _ (Lit 100) _ -> "du"
+                       _                    -> "duo"
+            )
+          , (3, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "trē"
+                       CtxMul _ (Lit 10)  _ -> "trī"
+                       CtxMul _ (Lit 100) _ -> "tre"
+                       _                    -> "trēs"
+            )
+          , (4, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "quadrā"
+                       CtxMul _ (Lit 100) _ -> "quadrin"
+                       _                    -> "quattuor"
+            )
+          , (5, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "quīn"
+                       CtxMul _ (Lit 10)  _ -> "quīnquā"
+                       CtxMul _ (Lit 100) _ -> "quīn"
+                       _                    -> "quīnque"
+            )
+          , (6, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "sē"
+                       CtxMul _ (Lit 10)  _ -> "sexā"
+                       CtxMul _ (Lit 100) _ -> "ses"
+                       _                    -> "sex"
+            )
+          , (7, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "septen"
+                       CtxMul _ (Lit 10)  _ -> "septuā"
+                       CtxMul _ (Lit 100) _ -> "septin"
+                       _                    -> "septem"
+            )
+          , (8, \c -> case c of
+                       CtxMul _ (Lit 100) _ -> "octin"
+                       _                    -> "octō"
+            )
+          , (9, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "nōnā"
+                       CtxMul _ (Lit 100) _ -> "nōn"
+                       _                    -> "novem"
+            )
+          , (10, \c -> case c of
+                        CtxAdd {}           -> "decim"
+                        CtxMul _ (Lit 2)  _ -> "gintī"
+                        CtxMul {}           -> "gintā"
+                        _                   -> "decem"
+            )
+          , (100, \c -> case c of
+                         CtxMul _ (Lit n) _
+                             | n `elem` [2,3,6] -> "centī"
+                             | otherwise        -> "gentī"
+                         _                      -> "centum"
+            )
+          , (1000, \c -> case c of
+                          CtxMul {} -> "milia"
+                          _         -> "mīlle"
+            )
+          ]
diff --git a/src/Text/Numeral/Language/LLD.hs b/src/Text/Numeral/Language/LLD.hs
--- a/src/Text/Numeral/Language/LLD.hs
+++ b/src/Text/Numeral/Language/LLD.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,19 +26,9 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Bool.Unicode     ( (∧), (∨) )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡), (≢) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
+import qualified "containers" Data.Map as M
 import           "this" Text.Numeral
 import qualified "this" Text.Numeral.BigNum  as BN
-import qualified "this" Text.Numeral.Exp     as E
-import qualified "this" Text.Numeral.Grammar as G
 import           "this" Text.Numeral.Misc ( dec )
 import "this" Text.Numeral.Entry
 import "this" Text.Numeral.Language.FUR ( struct )
@@ -55,7 +40,7 @@
 -- LLD
 --------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_3    = Just "lld"
     , entNativeNames = ["Ladin"]
@@ -66,16 +51,15 @@
                        }
     }
 
-cardinal ∷ (G.Masculine i, G.Feminine i, Integral α, E.Scale α)
-         ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = let x = dec 12 - 1 in (negate x, x)
 
-cardinalRepr ∷ (G.Feminine i, G.Masculine i) ⇒ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
+               { reprValue = \inf n -> M.lookup n (syms inf)
                , reprAdd   = Just (⊞)
                , reprMul   = Just (⊡)
                , reprScale = BN.pelletierRepr
@@ -84,8 +68,8 @@
                                []
                }
     where
-      (             Lit 20  ⊞ Lit n) _ | n ≢ 1 ∧          n ≢ 8  = "e"
-      ((Lit t `Mul` Lit 10) ⊞ Lit n) _ | n ≢ 1 ∧ (t ≡ 3 ∨ n ≢ 8) = "e"
+      (             Lit 20  ⊞ Lit n) _ | n /= 1 &&            n /= 8  = "e"
+      ((Lit t `Mul` Lit 10) ⊞ Lit n) _ | n /= 1 && (t == 3 || n /= 8) = "e"
       (         Lit 100  ⊞ _) _ = "e"
       ((_ `Mul` Lit 100) ⊞ _) _ = "e"
       ((_ `Mul` Scale{}) ⊞ _) _ = "e"
@@ -98,14 +82,14 @@
           M.fromList
           [ (0, const "zero")
           , (1, addCtx 10 "un"
-                $ \c → case c of
-                         _ | G.isFeminine inf → "una"
-                           | otherwise        → "un"
+                $ \c -> case c of
+                         _ | isFeminine inf -> "una"
+                           | otherwise      -> "un"
             )
           , (2, addCtx 10 "do"
-                $ \c → case c of
-                         _ | G.isFeminine inf → "does"
-                           | otherwise        → "doi"
+                $ \c -> case c of
+                         _ | isFeminine inf -> "does"
+                           | otherwise      -> "doi"
             )
           , (3, addCtx 10 "tre"   $ mulCtx 10 "tr"   $ const "trei")
           , (4, addCtx 10 "cator" $ mulCtx 10 "car"  $ const "cater")
@@ -114,16 +98,16 @@
           , (7, const "set")
           , (8, addCtx 10 "dot" $ const "ot")
           , (9, mulCtx 10 "non" $ const "nuef")
-          , (10, \c → case c of
+          , (10, \c -> case c of
                         CtxAdd _ (Lit n) _
-                            | n ≤ 6 → "desc"
-                            | n ≡ 7 → "dejes"
-                            | n ≤ 9 → "deje"
-                        CtxMul _ (Lit 3) (CtxAdd {}) → "ent"
-                        CtxMul _ (Lit 3) _ → "enta"
-                        CtxMul _ (Lit _) (CtxAdd {}) → "ant"
-                        CtxMul _ (Lit _) _ → "anta"
-                        _ → "diesc"
+                            | n <= 6 -> "desc"
+                            | n == 7 -> "dejes"
+                            | n <= 9 -> "deje"
+                        CtxMul _ (Lit 3) (CtxAdd {}) -> "ent"
+                        CtxMul _ (Lit 3) _ -> "enta"
+                        CtxMul _ (Lit _) (CtxAdd {}) -> "ant"
+                        CtxMul _ (Lit _) _ -> "anta"
+                        _ -> "diesc"
             )
           , (20, const "vint")
           , (100, mulCtx 6 "çent" $ const "cent")
diff --git a/src/Text/Numeral/Language/MG.hs b/src/Text/Numeral/Language/MG.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/MG.hs
+++ /dev/null
@@ -1,126 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        mg
-
-[@ISO639-2@]        mlg
-
-[@ISO639-3@]        mlg
-
-[@Native name@]     -
-
-[@English name@]    Malagasy
--}
-
-module Text.Numeral.Language.MG
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.List     ( map )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( (<) )
-import "base" Prelude       ( Integral, (-) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
--------------------------------------------------------------------------------
--- MG
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "mg"
-    , entIso639_2    = ["mlg"]
-    , entIso639_3    = Just "mlg"
-    , entEnglishName = Just "Malagasy"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
-struct = checkPos
-       $ fix
-       $ findRule (0, lit)
-                  [(n, step n 10 L L) | n ← map dec [1..6]]
-                  (dec 7 - 1)
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = (0, dec 7 - 1)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               }
-    where
-      (_ ⊞              Lit 10 ) _ = " ambin'ny "
-      (_ ⊞ (Lit _ `Mul` Lit 10)) _ = " amby "
-      (_ ⊞ _                   ) _ = " sy "
-
-      (_ ⊡ Lit 10 ) _ = ""
-      (_ ⊡ Lit 100) _ = ""
-      (_ ⊡ _      ) _ = " "
-
-      syms =
-          M.fromList
-          [ (0, const "haotra")
-          , (1, \c → case c of
-                       CtxAdd {} → "iraika"
-                       _         → "iray"
-            )
-          , (2, mulForms "roa"    "roa"   "roan")
-          , (3, mulForms "telo"   "telo"  "telon")
-          , (4, mulForms "efatra" "efa"   "efa"  )
-          , (5, mulForms "dimy"   "dimam" "diman")
-          , (6, mulForms "enina"  "enim"  "enin" )
-          , (7, mulForms "fito"   "fito"  "fiton")
-          , (8, mulForms "valo"   "valo"  "valon")
-          , (9, mulForms "sivy"   "sivi"  "sivin")
-          , (10, \c → case c of
-                        CtxMul _ (Lit n) _
-                            | n < 9 → "polo"
-                        _           → "folo"
-            )
-          , (100, \c → case c of
-                         CtxMul {} → "jato"
-                         _         → "zato"
-            )
-          , (1000, const "arivo")
-          , (dec 4, const "alina")
-          , (dec 5, const "hetsy")
-          , (dec 6, const "tapitrisa")
-          ]
-
-      mulForms o t h = \c → case c of
-                              CtxMul _ (Lit 10)  _ → t
-                              CtxMul _ (Lit 100) _ → h
-                              _                    → o
diff --git a/src/Text/Numeral/Language/MLG.hs b/src/Text/Numeral/Language/MLG.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/MLG.hs
@@ -0,0 +1,114 @@
+{-|
+[@ISO639-1@]        mg
+
+[@ISO639-2@]        mlg
+
+[@ISO639-3@]        mlg
+
+[@Native name@]     -
+
+[@English name@]    Malagasy
+-}
+
+module Text.Numeral.Language.MLG
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- MLG
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "mg"
+    , entIso639_2    = ["mlg"]
+    , entIso639_3    = Just "mlg"
+    , entEnglishName = Just "Malagasy"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = checkPos
+       $ fix
+       $ findRule (0, lit)
+                  [(n, step n 10 L L) | n <- map dec [1..6]]
+                  (dec 7 - 1)
+
+bounds :: (Integral a) => (a, a)
+bounds = (0, dec 7 - 1)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               }
+    where
+      (_ ⊞              Lit 10 ) _ = " ambin'ny "
+      (_ ⊞ (Lit _ `Mul` Lit 10)) _ = " amby "
+      (_ ⊞ _                   ) _ = " sy "
+
+      (_ ⊡ Lit 10 ) _ = ""
+      (_ ⊡ Lit 100) _ = ""
+      (_ ⊡ _      ) _ = " "
+
+      syms =
+          M.fromList
+          [ (0, const "haotra")
+          , (1, \c -> case c of
+                       CtxAdd {} -> "iraika"
+                       _         -> "iray"
+            )
+          , (2, mulForms "roa"    "roa"   "roan")
+          , (3, mulForms "telo"   "telo"  "telon")
+          , (4, mulForms "efatra" "efa"   "efa"  )
+          , (5, mulForms "dimy"   "dimam" "diman")
+          , (6, mulForms "enina"  "enim"  "enin" )
+          , (7, mulForms "fito"   "fito"  "fiton")
+          , (8, mulForms "valo"   "valo"  "valon")
+          , (9, mulForms "sivy"   "sivi"  "sivin")
+          , (10, \c -> case c of
+                        CtxMul _ (Lit n) _
+                            | n < 9 -> "polo"
+                        _           -> "folo"
+            )
+          , (100, \c -> case c of
+                         CtxMul {} -> "jato"
+                         _         -> "zato"
+            )
+          , (1000, const "arivo")
+          , (dec 4, const "alina")
+          , (dec 5, const "hetsy")
+          , (dec 6, const "tapitrisa")
+          ]
+
+      mulForms o t h = \c -> case c of
+                              CtxMul _ (Lit 10)  _ -> t
+                              CtxMul _ (Lit 100) _ -> h
+                              _                    -> o
diff --git a/src/Text/Numeral/Language/NEN.hs b/src/Text/Numeral/Language/NEN.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/NEN.hs
@@ -0,0 +1,95 @@
+{-|
+[@ISO639-1@]        -
+
+[@ISO639-2@]        -
+
+[@ISO639-3@]        nen
+
+[@Native name@]     -
+
+[@English name@]    Nengone
+-}
+module Text.Numeral.Language.NEN
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- NEN
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_3    = Just "nen"
+    , entEnglishName = Just "Nengone"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = checkPos
+       $ fix
+       $ findRule ( 0, lit     )
+                [ ( 6, add  5 R)
+                , (10, lit     )
+                , (11, add 10 R)
+                , (15, lit     )
+                , (16, add 15 R)
+                , (20, lit     )
+                , (21, add 20 R)
+                ]
+                   30
+
+bounds :: (Integral a) => (a, a)
+bounds = (0, 30)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just (⊞)
+               }
+    where
+      (Lit 5 ⊞ _) (CtxAdd _ (Lit 20) _) = ""
+      (_ ⊞ _) _ = " ne "
+
+      syms =
+          M.fromList
+          [ (1, const "sa")
+          , (2, forms "rewe" "rew")
+          , (3, forms "tini" "tin")
+          , (4, forms "ece"  "ec")
+          , (5, \c -> case c of
+                       CtxAdd _ _ (CtxAdd _ (Lit 20) _) -> "sedo"
+                       _ -> "sedong"
+            )
+          , (10, const "ruenin")
+          , (15, const "adenin")
+          , (20, const "sarengom")
+          ]
+        where
+          forms :: s -> s -> Ctx Exp -> s
+          forms _ a (CtxAdd _ _ _) = a
+          forms n _ _              = n
diff --git a/src/Text/Numeral/Language/NL.hs b/src/Text/Numeral/Language/NL.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/NL.hs
+++ /dev/null
@@ -1,268 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE PackageImports      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE UnicodeSyntax       #-}
-
-{-|
-[@ISO639-1@]        nl
-
-[@ISO639-2B@]       dut
-
-[@ISO639-3@]        nld
-
-[@Native name@]     Nederlands
-
-[@English name@]    Dutch
--}
-
-module Text.Numeral.Language.NL
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-    , ordinal
-    , partitive
-    , multiplicative
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Control.Monad ( return )
-import "base" Data.Bool     ( Bool, otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Functor  ( fmap )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( (<) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Bool.Unicode     ( (∧), (∨) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.List.Unicode     ( (∈) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum  as BN
-import qualified "this" Text.Numeral.Exp     as E
-import qualified "this" Text.Numeral.Grammar as G
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- NL
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1       = Just "nl"
-    , entIso639_2       = ["dut"]
-    , entIso639_3       = Just "nld"
-    , entNativeNames    = ["Nederlands"]
-    , entEnglishName    = Just "Dutch"
-    , entCardinal       = Just Conversion
-                          { toNumeral   = cardinal
-                          , toStructure = struct
-                          }
-    , entOrdinal        = Just Conversion
-                          { toNumeral   = ordinal
-                          , toStructure = struct
-                          }
-    , entPartitive      = Just Conversion
-                          { toNumeral   = partitive
-                          , toStructure = \(n, d) → E.frac (struct n) (struct d)
-                          }
-    , entMultiplicative = Just Conversion
-                          { toNumeral   = multiplicative
-                          , toStructure = struct
-                          }
-    }
-
-cardinal ∷ (G.Plural i, G.Dative i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-ordinal ∷ (Integral α, E.Scale α) ⇒ i → α → Maybe Text
-ordinal inf = ordinalRepr "eerste" inf ∘ struct
-
-partitive ∷ ( G.Singular i, G.Plural i, G.NoCase i, G.Dative i
-            , Integral α, E.Scale α
-            )
-          ⇒ i → (α, α) → Maybe Text
-partitive inf (n, d) = do
-  n' ← cardinal (G.noCase $ G.singular inf) n
-  d' ← ordinalRepr "éénde" inf $ struct d
-  return $ n' ⊕ " " ⊕ d'
-
-multiplicative ∷ ( G.Singular i, G.Plural i, G.NoCase i, G.Dative i
-                 , Integral α, E.Scale α
-                 )
-               ⇒ i → α → Maybe Text
-multiplicative inf = fmap (⊕ "maal") ∘ cardinal (G.noCase $ G.singular inf)
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         )
-       ⇒ α → β
-struct = pos
-       $ fix
-       $ findRule (   0, lit               )
-                [ (  13, add    10      L  )
-                , (  20, mul    10      L L)
-                , ( 100, step  100   10 R L)
-                , (1000, step 1000 1000 R L)
-                ]
-                  (dec 6 - 1)
-         `combine` pelletierScale R L BN.rule
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-genericRepr ∷ Repr i
-genericRepr = defaultRepr
-               { reprAdd   = Just (⊞)
-               , reprMul   = Just $ \_ _ _ → ""
-               , reprNeg   = Just $ \_ _   → "min "
-               }
-    where
-      (_     ⊞ Lit 10) _         = ""
-      (Lit n ⊞ _) _ | n ∈ [2,3]  = "ën"
-                    | n < 10     = "en"
-                    | otherwise  = ""
-      (_     ⊞ _) _              = ""
-
-cardinalRepr ∷ ∀ i. (G.Plural i, G.Dative i) ⇒ i → Exp i → Maybe Text
-cardinalRepr = render genericRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
-               , reprScale = BN.pelletierRepr (\i c → if doPlural i c then "iljoenen" else "iljoen")
-                                              (\i c → if doPlural i c then "iljarden" else "iljard")
-                                              []
-               }
-    where
-      doPlural ∷ i → Ctx (Exp i) → Bool
-      doPlural inf ctx = (G.isPlural inf ∨ G.isDative inf) ∧ isOutside R ctx
-
-      syms inf =
-          M.fromList
-          [ (0, const "nul")
-          , (1, pluralDative "één" "éénen" "éénen")
-          , (2, forms "twee" "twin" "tweeën" "tweeën")
-          , (3, forms "drie" "der"  "drieën" "drieën")
-          , (4, forms "vier" "veer" "vieren" "vieren")
-          , (5, pluralDative "vijf"  "vijven" "vijven")
-          , (6, pluralDative "zes"   "zessen" "zessen")
-          , (7, pluralDative "zeven" "zevens" "zevenen")
-          , (8, \c → case c of
-                       CtxMul _ (Lit 10) _ → "tach"
-                       CtxAdd _ (Lit 10) _ → "ach"
-                       _ | dativeForm c
-                         ∨ pluralForm c    → "achten"
-                         | otherwise       → "acht"
-            )
-          , (9, pluralDative "negen" "negens" "negenen")
-          , (10, \c → case c of
-                        CtxAdd R _ _
-                          | dativeForm c → "tienen"
-                          | pluralForm c → "tiens"
-                        CtxMul R _ _
-                          | dativeForm c → "tigen"
-                          | pluralForm c → "tigs"
-                          | otherwise    → "tig"
-                        _ | dativeForm c
-                          ∨ pluralForm c → "tienen"
-                          | otherwise    → "tien"
-            )
-          , (  11, pluralDative "elf"     "elven"     "elven")
-          , (  12, pluralDative "twaalf"  "twaalven"  "twaalven")
-          , ( 100, pluralDative "honderd" "honderden" "honderden")
-          , (1000, pluralDative "duizend" "duizenden" "duizenden")
-          ]
-          where
-            pluralDative ∷ s → s → s → Ctx (Exp i) → s
-            pluralDative  o p d ctx
-                | pluralForm ctx = p
-                | dativeForm ctx = d
-                | otherwise      = o
-
-            dativeForm ∷ Ctx (Exp i) → Bool
-            dativeForm ctx = G.isDative inf ∧ isOutside R ctx
-
-            pluralForm ∷ Ctx (Exp i) → Bool
-            pluralForm ctx = G.isPlural inf ∧ isOutside R ctx
-
-            forms ∷ s -- ^ Normal form.
-                  → s -- ^ Added to, or multiplied with ten.
-                  → s -- ^ Plural form.
-                  → s -- ^ Dative form.
-                  → Ctx (Exp i)
-                  → s
-            forms n t p d ctx =
-                case ctx of
-                  CtxMul _ (Lit 10) _ → t
-                  CtxAdd _ (Lit 10) _ → t
-                  _ | dativeForm ctx  → d
-                    | pluralForm ctx  → p
-                    | otherwise       → n
-
-ordinalRepr ∷ Text → i → Exp i → Maybe Text
-ordinalRepr one =
-    render genericRepr
-           { reprValue = \_ n → M.lookup n syms
-           , reprScale = BN.pelletierRepr ( BN.ordQuantityName "iljoen" "iljoenste"
-                                                               "iljoen" "iljoenste"
-                                          )
-                                          ( BN.ordQuantityName "iljard" "iljardste"
-                                                               "iljard" "iljardste"
-                                          )
-                                          []
-           }
-    where
-      syms =
-          M.fromList
-          [ (0, const "nulde")
-          , (1, \c → case c of
-                       CtxEmpty          → one
-                       _ | isOutside R c → "éénde"
-                         | otherwise     → "één"
-            )
-          , (2, forms "tweede"  "twee"  "twin")
-          , (3, forms "derde"   "drie"  "der")
-          , (4, forms "vierde"  "vier"  "veer")
-          , (5, forms "vijfde"  "vijf"  "vijf")
-          , (6, forms "zesde"   "zes"   "zes")
-          , (7, forms "zevende" "zeven" "zeven")
-          , (8, \c → case c of
-                       _ | isOutside R c → "achtste"
-                       CtxMul _ (Lit 10) _ → "tach"
-                       CtxAdd _ (Lit _)  _ → "ach"
-                       _                   → "acht"
-            )
-          , (9, forms "negende" "negen" "negen")
-          , (10, \c → case c of
-                        CtxMul R _ _ | isOutside R c → "tigste"
-                                     | otherwise     → "tig"
-                        _            | isOutside R c → "tiende"
-                                     | otherwise     → "tien"
-            )
-          , (11, \c → if isOutside R c then "elfde"    else "elf")
-          , (12, \c → if isOutside R c then "twaalfde" else "twaalf")
-          , (100,  \c → if isOutside R c then "honderdste" else "honderd")
-          , (1000, \c → if isOutside R c then "duizendste" else "duizend")
-          ]
-
-      forms ∷ s -- ^ Ordinal form.
-            → s -- ^ Cardinal form.
-            → s -- ^ Added to, or multiplied with, ten.
-            → Ctx (Exp i)
-            → s
-      forms o c t ctx = case ctx of
-                          _ | isOutside R ctx → o
-                          CtxMul _ (Lit 10) _ → t
-                          CtxAdd _ (Lit _)  _ → t
-                          _                   → c
diff --git a/src/Text/Numeral/Language/NLD.hs b/src/Text/Numeral/Language/NLD.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/NLD.hs
@@ -0,0 +1,240 @@
+{-|
+[@ISO639-1@]        nl
+
+[@ISO639-2B@]       dut
+
+[@ISO639-3@]        nld
+
+[@Native name@]     Nederlands
+
+[@English name@]    Dutch
+-}
+
+module Text.Numeral.Language.NLD
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+    , ordinal
+    , partitive
+    , multiplicative
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import "base" Data.Monoid ( (<>) )
+import qualified "containers" Data.Map as M
+import           "this" Text.Numeral hiding ( partitive, multiplicative )
+import qualified "this" Text.Numeral.BigNum  as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- NLD
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1       = Just "nl"
+    , entIso639_2       = ["dut"]
+    , entIso639_3       = Just "nld"
+    , entNativeNames    = ["Nederlands"]
+    , entEnglishName    = Just "Dutch"
+    , entCardinal       = Just Conversion
+                          { toNumeral   = cardinal
+                          , toStructure = struct
+                          }
+    , entOrdinal        = Just Conversion
+                          { toNumeral   = ordinal
+                          , toStructure = struct
+                          }
+    , entPartitive      = Just Conversion
+                          { toNumeral   = partitive
+                          , toStructure = \(n, d) -> Frac (struct n) (struct d)
+                          }
+    , entMultiplicative = Just Conversion
+                          { toNumeral   = multiplicative
+                          , toStructure = struct
+                          }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+ordinal inf = ordinalRepr "eerste" inf . struct
+
+partitive :: (Integral a) => Inflection -> (a, a) -> Maybe Text
+partitive inf (n, d) = do
+  n' <- cardinal inf {iCase = Nothing, iNumber = Just Singular} n
+  d' <- ordinalRepr "éénde" inf $ struct d
+  pure $ n' <> " " <> d'
+
+multiplicative :: (Integral a) => Inflection -> a -> Maybe Text
+multiplicative inf = fmap (<> "maal") . cardinal (noCase $ singular inf)
+
+struct :: (Integral a) => a -> Exp
+struct = pos
+       $ fix
+       $ findRule (   0, lit               )
+                [ (  13, add    10      L  )
+                , (  20, mul    10      L L)
+                , ( 100, step  100   10 R L)
+                , (1000, step 1000 1000 R L)
+                ]
+                  (dec 6 - 1)
+         `combine` pelletierScale R L BN.rule
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+genericRepr :: Repr
+genericRepr = defaultRepr
+               { reprAdd   = Just (⊞)
+               , reprMul   = Just $ \_ _ _ -> ""
+               , reprNeg   = Just $ \_ _   -> "min "
+               }
+    where
+      (_     ⊞ Lit 10) _ = ""
+      (Lit n ⊞ _) _ | n `elem` [2,3]  = "ën"
+                    | n < 10     = "en"
+                    | otherwise  = ""
+      (_     ⊞ _) _             = ""
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render genericRepr
+               { reprValue = \inf n -> M.lookup n (syms inf)
+               , reprScale = BN.pelletierRepr (\i c -> if doPlural i c then "iljoenen" else "iljoen")
+                                              (\i c -> if doPlural i c then "iljarden" else "iljard")
+                                              []
+               }
+    where
+      doPlural :: Inflection -> Ctx Exp -> Bool
+      doPlural inf ctx = (isPlural inf || isDative inf) && isOutside R ctx
+
+      syms inf =
+          M.fromList
+          [ (0, const "nul")
+          , (1, pluralDative "één" "éénen" "éénen")
+          , (2, forms "twee" "twin" "tweeën" "tweeën")
+          , (3, forms "drie" "der"  "drieën" "drieën")
+          , (4, forms "vier" "veer" "vieren" "vieren")
+          , (5, pluralDative "vijf"  "vijven" "vijven")
+          , (6, pluralDative "zes"   "zessen" "zessen")
+          , (7, pluralDative "zeven" "zevens" "zevenen")
+          , (8, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "tach"
+                       CtxAdd _ (Lit 10) _ -> "ach"
+                       _ | dativeForm c || pluralForm c -> "achten"
+                         | otherwise -> "acht"
+            )
+          , (9, pluralDative "negen" "negens" "negenen")
+          , (10, \c -> case c of
+                        CtxAdd R _ _
+                          | dativeForm c -> "tienen"
+                          | pluralForm c -> "tiens"
+                        CtxMul R _ _
+                          | dativeForm c -> "tigen"
+                          | pluralForm c -> "tigs"
+                          | otherwise    -> "tig"
+                        _ | dativeForm c || pluralForm c -> "tienen"
+                          | otherwise    -> "tien"
+            )
+          , (  11, pluralDative "elf"     "elven"     "elven")
+          , (  12, pluralDative "twaalf"  "twaalven"  "twaalven")
+          , ( 100, pluralDative "honderd" "honderden" "honderden")
+          , (1000, pluralDative "duizend" "duizenden" "duizenden")
+          ]
+          where
+            pluralDative :: s -> s -> s -> Ctx Exp -> s
+            pluralDative  o p d ctx
+                | pluralForm ctx = p
+                | dativeForm ctx = d
+                | otherwise      = o
+
+            dativeForm :: Ctx Exp -> Bool
+            dativeForm ctx = isDative inf && isOutside R ctx
+
+            pluralForm :: Ctx Exp -> Bool
+            pluralForm ctx = isPlural inf && isOutside R ctx
+
+            forms :: s -- ^ Normal form.
+                  -> s -- ^ Added to, or multiplied with ten.
+                  -> s -- ^ Plural form.
+                  -> s -- ^ Dative form.
+                  -> Ctx Exp
+                  -> s
+            forms n t p d ctx =
+                case ctx of
+                  CtxMul _ (Lit 10) _ -> t
+                  CtxAdd _ (Lit 10) _ -> t
+                  _ | dativeForm ctx  -> d
+                    | pluralForm ctx  -> p
+                    | otherwise       -> n
+
+ordinalRepr :: Text -> Inflection -> Exp -> Maybe Text
+ordinalRepr one =
+    render genericRepr
+           { reprValue = \_ n -> M.lookup n syms
+           , reprScale = BN.pelletierRepr ( BN.ordQuantityName "iljoen" "iljoenste"
+                                                               "iljoen" "iljoenste"
+                                          )
+                                          ( BN.ordQuantityName "iljard" "iljardste"
+                                                               "iljard" "iljardste"
+                                          )
+                                          []
+           }
+    where
+      syms =
+          M.fromList
+          [ (0, const "nulde")
+          , (1, \c -> case c of
+                       CtxEmpty          -> one
+                       _ | isOutside R c -> "éénde"
+                         | otherwise     -> "één"
+            )
+          , (2, forms "tweede"  "twee"  "twin")
+          , (3, forms "derde"   "drie"  "der")
+          , (4, forms "vierde"  "vier"  "veer")
+          , (5, forms "vijfde"  "vijf"  "vijf")
+          , (6, forms "zesde"   "zes"   "zes")
+          , (7, forms "zevende" "zeven" "zeven")
+          , (8, \c -> case c of
+                       _ | isOutside R c -> "achtste"
+                       CtxMul _ (Lit 10) _ -> "tach"
+                       CtxAdd _ (Lit _)  _ -> "ach"
+                       _                   -> "acht"
+            )
+          , (9, forms "negende" "negen" "negen")
+          , (10, \c -> case c of
+                        CtxMul R _ _ | isOutside R c -> "tigste"
+                                     | otherwise     -> "tig"
+                        _            | isOutside R c -> "tiende"
+                                     | otherwise     -> "tien"
+            )
+          , (11, \c -> if isOutside R c then "elfde"    else "elf")
+          , (12, \c -> if isOutside R c then "twaalfde" else "twaalf")
+          , (100,  \c -> if isOutside R c then "honderdste" else "honderd")
+          , (1000, \c -> if isOutside R c then "duizendste" else "duizend")
+          ]
+
+      forms :: s -- ^ Ordinal form.
+            -> s -- ^ Cardinal form.
+            -> s -- ^ Added to, or multiplied with, ten.
+            -> Ctx Exp
+            -> s
+      forms o c t ctx = case ctx of
+                          _ | isOutside R ctx -> o
+                          CtxMul _ (Lit 10) _ -> t
+                          CtxAdd _ (Lit _)  _ -> t
+                          _                   -> c
diff --git a/src/Text/Numeral/Language/NO.hs b/src/Text/Numeral/Language/NO.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/NO.hs
+++ /dev/null
@@ -1,136 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        nb
-
-[@ISO639-2B@]       nob
-
-[@ISO639-3@]        nob
-
-[@Native name@]     Bokmål
-
-[@English name@]    Norwegian Bokmål
--}
-
-module Text.Numeral.Language.NO
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum as BN
-import qualified "this" Text.Numeral.Exp    as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
--------------------------------------------------------------------------------
--- NO
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "nb"
-    , entIso639_2    = ["nob"]
-    , entIso639_3    = Just "nob"
-    , entNativeNames = ["Bokmål"]
-    , entEnglishName = Just "Norwegian Bokmål"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         )
-       ⇒ α → β
-struct = pos
-       $ fix
-       $ findRule (   0, lit               )
-                [ (  13, add    10      L  )
-                , (  20, lit               )
-                , (  21, add    20      R  )
-                , (  30, mul    10      R L)
-                , ( 100, step  100   10 R L)
-                , (1000, step 1000 1000 R L)
-                ]
-                  (dec 6 - 1)
-         `combine` pelletierScale R L BN.rule
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprScale = BN.scaleRepr (BN.quantityName "illion" "illioner") []
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               , reprNeg   = Just $ \_ _   → "minus "
-               }
-    where
-      (Lit 100  ⊞ _) _ = " "
-      (Lit 1000 ⊞ _) _ = " "
-      (_        ⊞ _) _ = ""
-
-      (_ ⊡ Lit 10  ) _ = ""
-      (_ ⊡ Lit 1000) _ = ""
-      (_ ⊡ _       ) _ = " "
-
-      syms =
-          M.fromList
-          [ (0,  const "null")
-          , (1,  \c → case c of
-                        CtxEmpty → "én"
-                        _        → "en"
-            )
-          , (2,  const "to")
-          , (3,  tenForms   "tre"  "tret" "tret")
-          , (4,  tenForms   "fire" "fjor" "før")
-          , (5,  const "fem")
-          , (6,  const "seks")
-          , (7,  tenForms   "sju"  "syt"  "syt")
-          , (8,  tenForms   "åtte" "at"   "åt")
-          , (9,  tenForms   "ni"   "nit"  "nit")
-          , (10, \c → case c of
-                        CtxAdd {} → "ten"
-                        _         → "ti"
-            )
-          , (11, const "elleve")
-          , (12, const "tolv")
-          , (20, const "tjue")
-          , (100, const "hundre")
-          , (1000, const "tusen")
-          ]
-
-      tenForms n a m = \c → case c of
-                              CtxAdd _ (Lit 10  ) _ → a
-                              CtxMul _ (Lit 100 ) _ → n
-                              CtxMul _ (Lit 1000) _ → n
-                              CtxMul {}             → m
-                              _                     → n
diff --git a/src/Text/Numeral/Language/NOB.hs b/src/Text/Numeral/Language/NOB.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/NOB.hs
@@ -0,0 +1,123 @@
+{-|
+[@ISO639-1@]        nb
+
+[@ISO639-2B@]       nob
+
+[@ISO639-3@]        nob
+
+[@Native name@]     Bokmål
+
+[@English name@]    Norwegian Bokmål
+-}
+
+module Text.Numeral.Language.NOB
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- NOB
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "nb"
+    , entIso639_2    = ["nob"]
+    , entIso639_3    = Just "nob"
+    , entNativeNames = ["Bokmål"]
+    , entEnglishName = Just "Norwegian Bokmål"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = pos
+       $ fix
+       $ findRule (   0, lit               )
+                [ (  13, add    10      L  )
+                , (  20, lit               )
+                , (  21, add    20      R  )
+                , (  30, mul    10      R L)
+                , ( 100, step  100   10 R L)
+                , (1000, step 1000 1000 R L)
+                ]
+                  (dec 6 - 1)
+         `combine` pelletierScale R L BN.rule
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprScale = BN.scaleRepr (BN.quantityName "illion" "illioner") []
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               , reprNeg   = Just $ \_ _   -> "minus "
+               }
+    where
+      (Lit 100  ⊞ _) _ = " "
+      (Lit 1000 ⊞ _) _ = " "
+      (_        ⊞ _) _ = ""
+
+      (_ ⊡ Lit 10  ) _ = ""
+      (_ ⊡ Lit 1000) _ = ""
+      (_ ⊡ _       ) _ = " "
+
+      syms =
+          M.fromList
+          [ (0,  const "null")
+          , (1,  \c -> case c of
+                        CtxEmpty -> "én"
+                        _        -> "en"
+            )
+          , (2,  const "to")
+          , (3,  tenForms   "tre"  "tret" "tret")
+          , (4,  tenForms   "fire" "fjor" "før")
+          , (5,  const "fem")
+          , (6,  const "seks")
+          , (7,  tenForms   "sju"  "syt"  "syt")
+          , (8,  tenForms   "åtte" "at"   "åt")
+          , (9,  tenForms   "ni"   "nit"  "nit")
+          , (10, \c -> case c of
+                        CtxAdd {} -> "ten"
+                        _         -> "ti"
+            )
+          , (11, const "elleve")
+          , (12, const "tolv")
+          , (20, const "tjue")
+          , (100, const "hundre")
+          , (1000, const "tusen")
+          ]
+
+      tenForms n a m = \c -> case c of
+                              CtxAdd _ (Lit 10  ) _ -> a
+                              CtxMul _ (Lit 100 ) _ -> n
+                              CtxMul _ (Lit 1000) _ -> n
+                              CtxMul {}             -> m
+                              _                     -> n
diff --git a/src/Text/Numeral/Language/NQM.hs b/src/Text/Numeral/Language/NQM.hs
--- a/src/Text/Numeral/Language/NQM.hs
+++ b/src/Text/Numeral/Language/NQM.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,14 +26,9 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
+import "base" Data.Function ( fix )
 import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
+import "this" Text.Numeral
 import "this" Text.Numeral.Entry
 import "text" Data.Text ( Text )
 
@@ -47,7 +37,7 @@
 -- NQM
 --------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_3    = Just "nqm"
     , entEnglishName = Just "Ndom"
@@ -57,10 +47,10 @@
                        }
     }
 
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
+struct :: (Integral a) => a -> Exp
 struct = checkPos
        $ fix
        $ findRule (  1, lit       )
@@ -74,13 +64,13 @@
                 ]
                    107
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = (1, 107)
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just $ \_ _ _ → " abo "
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just $ \_ _ _ -> " abo "
                , reprMul   = Just (⊡)
                }
     where
diff --git a/src/Text/Numeral/Language/OJ.hs b/src/Text/Numeral/Language/OJ.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/OJ.hs
+++ /dev/null
@@ -1,114 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        oj
-
-[@ISO639-2@]        oji
-
-[@ISO639-3@]        oji
-
-[@Native name@]     ᐊᓂᔑᓈᐯᒧᐎᓐ (Anishinaabemowin)
-
-[@English name@]    Ojibwe
--}
-
-module Text.Numeral.Language.OJ
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- OJ
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "oj"
-    , entIso639_2    = ["oji"]
-    , entIso639_3    = Just "oji"
-    , entNativeNames = ["ᐊᓂᔑᓈᐯᒧᐎᓐ", "Anishinaabemowin"]
-    , entEnglishName = Just "Ojibwe"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β)
-       ⇒ α → β
-struct = checkPos
-       $ fix
-       $ findRule (   1, lit             )
-                [ (  11, step   10 10 R L)
-                , ( 100, step  100 10 R L)
-                , (1000, step 1000  2 R L)
-                ]
-                   1999
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = (1, 1999)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just $ \_ _ _ → " shaa "
-               , reprMul   = Just $ \_ _ _ → ""
-               }
-    where
-      syms =
-          M.fromList
-          [ (0, const "kaagego"                              )
-          , (1, const "bezhik"                               )
-          , (2, const "niizh"                                )
-          , (3, forms "nswi"        "nsim"        "ns"       )
-          , (4, forms "niiwin"      "niim"        "nii"      )
-          , (5, forms "naanan"      "naanmi"      "naan"     )
-          , (6, forms "ngodwaaswi"  "ngodwaasmi"  "ngodwaas" )
-          , (7, forms "niizhwaaswi" "niizhwaasmi" "niizhwaas")
-          , (8, forms "nshwaaswi"   "nshwaasmi"   "nshwaas"  )
-          , (9, forms "zhaangswi"   "zhaangsmi"   "zhaangs"  )
-          , (10, \c → case c of
-                        CtxMul {} → "taana"
-                        _         → "mdaaswi"
-            )
-          , (100, \c → case c of
-                         CtxMul {} → "waak"
-                         _         → "ngodwaak"
-            )
-          , (1000, const "mdaaswaak")
-          ]
-
-      forms ∷ s → s → s → Ctx (Exp i) → s
-      forms o t h = \c → case c of
-                           CtxMul _ (Lit 10)  _ → t
-                           CtxMul _ (Lit 100) _ → h
-                           _                    → o
diff --git a/src/Text/Numeral/Language/OJI.hs b/src/Text/Numeral/Language/OJI.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/OJI.hs
@@ -0,0 +1,103 @@
+{-|
+[@ISO639-1@]        oj
+
+[@ISO639-2@]        oji
+
+[@ISO639-3@]        oji
+
+[@Native name@]     ᐊᓂᔑᓈᐯᒧᐎᓐ (Anishinaabemowin)
+
+[@English name@]    Ojibwe
+-}
+
+module Text.Numeral.Language.OJI
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- OJ
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "oj"
+    , entIso639_2    = ["oji"]
+    , entIso639_3    = Just "oji"
+    , entNativeNames = ["ᐊᓂᔑᓈᐯᒧᐎᓐ", "Anishinaabemowin"]
+    , entEnglishName = Just "Ojibwe"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = checkPos
+       $ fix
+       $ findRule (   1, lit             )
+                [ (  11, step   10 10 R L)
+                , ( 100, step  100 10 R L)
+                , (1000, step 1000  2 R L)
+                ]
+                   1999
+
+bounds :: (Integral a) => (a, a)
+bounds = (1, 1999)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just $ \_ _ _ -> " shaa "
+               , reprMul   = Just $ \_ _ _ -> ""
+               }
+    where
+      syms =
+          M.fromList
+          [ (0, const "kaagego"                              )
+          , (1, const "bezhik"                               )
+          , (2, const "niizh"                                )
+          , (3, forms "nswi"        "nsim"        "ns"       )
+          , (4, forms "niiwin"      "niim"        "nii"      )
+          , (5, forms "naanan"      "naanmi"      "naan"     )
+          , (6, forms "ngodwaaswi"  "ngodwaasmi"  "ngodwaas" )
+          , (7, forms "niizhwaaswi" "niizhwaasmi" "niizhwaas")
+          , (8, forms "nshwaaswi"   "nshwaasmi"   "nshwaas"  )
+          , (9, forms "zhaangswi"   "zhaangsmi"   "zhaangs"  )
+          , (10, \c -> case c of
+                        CtxMul {} -> "taana"
+                        _         -> "mdaaswi"
+            )
+          , (100, \c -> case c of
+                         CtxMul {} -> "waak"
+                         _         -> "ngodwaak"
+            )
+          , (1000, const "mdaaswaak")
+          ]
+
+      forms :: s -> s -> s -> Ctx Exp -> s
+      forms o t h = \c -> case c of
+                           CtxMul _ (Lit 10)  _ -> t
+                           CtxMul _ (Lit 100) _ -> h
+                           _                    -> o
diff --git a/src/Text/Numeral/Language/PDC.hs b/src/Text/Numeral/Language/PDC.hs
--- a/src/Text/Numeral/Language/PDC.hs
+++ b/src/Text/Numeral/Language/PDC.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,17 +26,10 @@
 -- Imports
 -------------------------------------------------------------------------------
 
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Nothing, Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M
 import           "this" Text.Numeral
 import qualified "this" Text.Numeral.BigNum as BN
-import qualified "this" Text.Numeral.Exp    as E
-import           "this" Text.Numeral.Grammar ( Inflection )
 import           "this" Text.Numeral.Misc ( dec )
 import "this" Text.Numeral.Entry
 import "text" Data.Text ( Text )
@@ -51,7 +39,7 @@
 -- PDC
 -------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_1    = Nothing
     , entIso639_2    = []
@@ -65,13 +53,10 @@
     , entOrdinal     = Nothing
     }
 
-cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         )
-       ⇒ α → β
+struct :: (Integral a) => a -> Exp
 struct = pos
        $ fix
        $ findRule (   0, lit       )
@@ -83,18 +68,18 @@
                   (dec 6 - 1)
          `combine` pelletierScale1 R L BN.rule
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = (0, dec 9 - 1)
 
-genericRepr ∷ Repr i
+genericRepr :: Repr
 genericRepr = defaultRepr
               { reprAdd   = Just (⊞)
               , reprMul   = Just (⊡)
-              , reprNeg   = Just $ \_ _ → "minus "
+              , reprNeg   = Just $ \_ _ -> "minus "
               }
     where
-      (Lit n ⊞ (_ `Mul` Lit 10)) _ | n ≤ 9 = "un"
-      ((Lit _ `Mul` Lit 100) ⊞ Lit _ ) _ = " un "
+      (Lit n ⊞ (_ `Mul` Lit 10)) _ | n <= 9 = "un"
+      ((Lit _ `Mul` Lit 100) ⊞ Lit _ ) _    = " un "
       (_ ⊞ Lit 10) _ = ""
       (_ ⊞ _     ) _ = " "
 
@@ -102,9 +87,9 @@
       (_ ⊡ _)      _ = " "
 
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render genericRepr
-               { reprValue = \_ n → M.lookup n syms
+               { reprValue = \_ n -> M.lookup n syms
                , reprScale = BN.pelletierRepr (BN.quantityName "illyon"  "illyon")
                                               (BN.quantityName "illyard" "illyard")
                                               []
@@ -113,44 +98,43 @@
       syms =
           M.fromList
           [ (0, const "null")
-          , (1, \c → case c of
-                       CtxAdd L _ _  → "een"
-                       CtxMul _ _ _  → "en"
-                       _             → "eens"
+          , (1, \c -> case c of
+                       CtxAdd L _ _  -> "een"
+                       CtxMul _ _ _  -> "en"
+                       _             -> "eens"
             )
-          , (2, \c → case c of
-                       CtxMul _ (Lit 10) _ → "zwan"
-                       _                   → "zwee"
+          , (2, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "zwan"
+                       _                   -> "zwee"
             )
           , (3, const "drei")
-          , (4, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "va"
-                       CtxMul _ (Lit 10) _ → "va"
-                       _                   → "vier"
+          , (4, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "va"
+                       CtxMul _ (Lit 10) _ -> "va"
+                       _                   -> "vier"
             )
-          , (5, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "fuff"
-                       CtxMul _ (Lit 10) _ → "fuff"
-                       _                   → "fimf"
+          , (5, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "fuff"
+                       CtxMul _ (Lit 10) _ -> "fuff"
+                       _                   -> "fimf"
             )
-          , (6, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "sech"
-                       CtxMul _ (Lit 10) _ → "sech"
-                       _                   → "sex"
+          , (6, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "sech"
+                       CtxMul _ (Lit 10) _ -> "sech"
+                       _                   -> "sex"
             )
           , (7, const "siwwe")
           , (8, const "acht")
           , (9, const "nein")
-          , (10, \c → case c of
-                        CtxAdd _ (Lit _) _ → "zeh"
-                        CtxMul _ (Lit 3) _ → "ssich"
-                        CtxMul R (Lit n) _ | n ≤ 3     → "sich"
-                                           | otherwise → "zich"
-                        _                  → "zehe"
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit _) _ -> "zeh"
+                        CtxMul _ (Lit 3) _ -> "ssich"
+                        CtxMul R (Lit n) _ | n <= 3    -> "sich"
+                                           | otherwise -> "zich"
+                        _                  -> "zehe"
             )
           , (11, const "elf")
           , (12, const "zwelf")
           , (100, const "hunnert")
           , (1000, const "dausend")
           ]
-
diff --git a/src/Text/Numeral/Language/PL.hs b/src/Text/Numeral/Language/PL.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/PL.hs
+++ /dev/null
@@ -1,165 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        pl
-
-[@ISO639-2@]        pol
-
-[@ISO639-3@]        pol
-
-[@Native name@]     język polski
-
-[@English name@]    Polish
--}
-
-module Text.Numeral.Language.PL
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≥), (≤) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum as BN
-import qualified "this" Text.Numeral.Exp    as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
--------------------------------------------------------------------------------
--- PL
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "pl"
-    , entIso639_2    = ["pol"]
-    , entIso639_3    = Just "pol"
-    , entNativeNames = ["język polski"]
-    , entEnglishName = Just "Polish"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
--- | liczebniki główne
-cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         )
-       ⇒ α → β
-struct = pos
-       $ fix
-       $ findRule (   0, lit               )
-                [ (  11, add    10      L  )
-                , (  20, step   10   10 R L)
-                , ( 100, step  100   10 R L)
-                , (1000, step 1000 1000 R L)
-                ]
-                  (dec 6 - 1)
-         `combine` pelletierScale R L BN.rule
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprScale = BN.pelletierRepr (quantityRepr "ilion"  "iliony"  "ilionów")
-                                              (quantityRepr "iliard" "iliardy" "iliardów")
-                                              []
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               }
-    where
-      (Lit n ⊞ Lit 10) _ | n ≤ 9 = ""
-      (_     ⊞ _     ) _         = " "
-
-      (_ ⊡ Lit 10 ) _ = ""
-      (_ ⊡ Lit 100) _ = ""
-      (_ ⊡ _      ) _ = " "
-
-      quantityRepr ∷ Text → Text → Text → BN.PostfixRepr i
-      quantityRepr s p1 p2 _ ctx =
-          case ctx of
-            CtxMul _ (Lit 1) _ → s
-            CtxMul _ (Lit n) _ | n ≤ 4 → p1
-            CtxMul {}          → p2
-            _                  → s
-
-      syms =
-          M.fromList
-          [ (0,  const                         "zero")
-          , (1,  \c → case c of
-                        CtxAdd _ (Lit 10)  _ → "jede"
-                        _                    → "jeden"
-            )
-          , (2,  \c → case c of
-                        CtxMul _ (Lit 100) _ → "dwie"
-                        _                    → "dwa"
-            )
-          , (3, const                          "trzy")
-          , (4,  \c → case c of
-                        CtxAdd _ (Lit 10)  _ → "czter"
-                        CtxMul _ (Lit 10)  _ → "czter"
-                        _                    → "cztery"
-            )
-          , (5,  \c → case c of
-                        CtxAdd _ (Lit 10)  _ → "pięt"
-                        _                    → "pięć"
-            )
-          , (6,  \c → case c of
-                        CtxAdd _ (Lit 10)  _ → "szes"
-                        _                    → "sześć"
-            )
-          , (7,  const                         "siedem")
-          , (8,  const                         "osiem")
-          , (9,  \c → case c of
-                        CtxAdd _ (Lit 10)  _ → "dziewięt"
-                        _                    → "dziewięć"
-            )
-          , (10,  \c → case c of
-                         CtxAdd R (Lit n) _ | n ≤ 9 → "naście"
-                         CtxMul R (Lit n) _
-                             | n ≡ 2     → "dzieścia"
-                             | n ≥ 5     → "dziesiąt"
-                             | otherwise → "dzieści"
-                         _               → "dziesięć"
-            )
-          , (100, \c → case c of
-                         CtxMul _ (Lit n) _
-                             | n ≡ 2 → "ście"
-                             | n ≤ 4 → "sta"
-                             | n ≤ 9 → "set"
-                         _           → "sto"
-            )
-          , (1000, \c → case c of
-                          CtxMul _ (Lit n) _ | n ≤ 4 → "tysiące"
-                          CtxMul {}                  → "tysięcy"
-                          _                          → "tysiąc"
-            )
-          ]
diff --git a/src/Text/Numeral/Language/POL.hs b/src/Text/Numeral/Language/POL.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/POL.hs
@@ -0,0 +1,151 @@
+{-|
+[@ISO639-1@]        pl
+
+[@ISO639-2@]        pol
+
+[@ISO639-3@]        pol
+
+[@Native name@]     język polski
+
+[@English name@]    Polish
+-}
+
+module Text.Numeral.Language.POL
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+-------------------------------------------------------------------------------
+-- POL
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "pl"
+    , entIso639_2    = ["pol"]
+    , entIso639_3    = Just "pol"
+    , entNativeNames = ["język polski"]
+    , entEnglishName = Just "Polish"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+-- | liczebniki główne
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = pos
+       $ fix
+       $ findRule (   0, lit               )
+                [ (  11, add    10      L  )
+                , (  20, step   10   10 R L)
+                , ( 100, step  100   10 R L)
+                , (1000, step 1000 1000 R L)
+                ]
+                  (dec 6 - 1)
+         `combine` pelletierScale R L BN.rule
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprScale = BN.pelletierRepr (quantityRepr "ilion"  "iliony"  "ilionów")
+                                              (quantityRepr "iliard" "iliardy" "iliardów")
+                                              []
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               }
+    where
+      (Lit n ⊞ Lit 10) _ | n <= 9 = ""
+      (_     ⊞ _     ) _          = " "
+
+      (_ ⊡ Lit 10 ) _ = ""
+      (_ ⊡ Lit 100) _ = ""
+      (_ ⊡ _      ) _ = " "
+
+      quantityRepr :: Text -> Text -> Text -> BN.PostfixRepr
+      quantityRepr s p1 p2 _ ctx =
+          case ctx of
+            CtxMul _ (Lit 1) _ -> s
+            CtxMul _ (Lit n) _ | n <= 4 -> p1
+            CtxMul {}          -> p2
+            _                  -> s
+
+      syms =
+          M.fromList
+          [ (0,  const                         "zero")
+          , (1,  \c -> case c of
+                        CtxAdd _ (Lit 10)  _ -> "jede"
+                        _                    -> "jeden"
+            )
+          , (2,  \c -> case c of
+                        CtxMul _ (Lit 100) _ -> "dwie"
+                        _                    -> "dwa"
+            )
+          , (3, const                          "trzy")
+          , (4,  \c -> case c of
+                        CtxAdd _ (Lit 10)  _ -> "czter"
+                        CtxMul _ (Lit 10)  _ -> "czter"
+                        _                    -> "cztery"
+            )
+          , (5,  \c -> case c of
+                        CtxAdd _ (Lit 10)  _ -> "pięt"
+                        _                    -> "pięć"
+            )
+          , (6,  \c -> case c of
+                        CtxAdd _ (Lit 10)  _ -> "szes"
+                        _                    -> "sześć"
+            )
+          , (7,  const                         "siedem")
+          , (8,  const                         "osiem")
+          , (9,  \c -> case c of
+                        CtxAdd _ (Lit 10)  _ -> "dziewięt"
+                        _                    -> "dziewięć"
+            )
+          , (10,  \c -> case c of
+                         CtxAdd R (Lit n) _
+                             | n <= 9 -> "naście"
+                         CtxMul R (Lit n) _
+                             | n == 2     -> "dzieścia"
+                             | n >= 5     -> "dziesiąt"
+                             | otherwise -> "dzieści"
+                         _               -> "dziesięć"
+            )
+          , (100, \c -> case c of
+                         CtxMul _ (Lit n) _
+                             | n == 2 -> "ście"
+                             | n <= 4 -> "sta"
+                             | n <= 9 -> "set"
+                         _            -> "sto"
+            )
+          , (1000, \c -> case c of
+                          CtxMul _ (Lit n) _
+                              | n <= 4 -> "tysiące"
+                          CtxMul {}    -> "tysięcy"
+                          _            -> "tysiąc"
+            )
+          ]
diff --git a/src/Text/Numeral/Language/POR.hs b/src/Text/Numeral/Language/POR.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/POR.hs
@@ -0,0 +1,278 @@
+{-|
+[@ISO639-1@]        pt
+
+[@ISO639-2@]        por
+
+[@ISO639-3@]        por
+
+[@Native name@]     Português
+
+[@English name@]    Portuguese
+-}
+
+module Text.Numeral.Language.POR
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+    , ordinal
+      -- * Structure
+    , cardinal_struct
+    , ordinal_struct
+      -- * Bounds
+    , bounds
+    ) where
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import "base" Data.Monoid ( (<>) )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum  as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- POR
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "pt"
+    , entIso639_2    = ["por"]
+    , entIso639_3    = Just "por"
+    , entNativeNames = ["Português"]
+    , entEnglishName = Just "Portuguese"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = cardinal_struct
+                       }
+    , entOrdinal     = Just Conversion
+                       { toNumeral   = ordinal
+                       , toStructure = ordinal_struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . cardinal_struct
+
+ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+ordinal inf = ordinalRepr inf . ordinal_struct
+
+cardinal_struct :: (Integral a) => a -> Exp
+cardinal_struct = pos $ fix $ rule `combine` shortScale1_pt
+    where
+      rule = findRule (   0, lit       )
+                    [ (  11, add 10 L  )
+                    , (  16, add 10 R  )
+                    , (  20, mul 10 R L)
+                    , ( 100, step  100   10 R L)
+                    , (1000, step 1000 1000 R L)
+                    ]
+                      (dec 6 - 1)
+
+ordinal_struct :: (Integral a) => a -> Exp
+ordinal_struct = pos $ fix $ rule `combine` shortScale1_pt
+    where
+      rule = findRule (   0, lit       )
+                    [ (  11, add 10 R  )
+                    , (  20, mul 10 R L)
+                    , ( 100, step  100   10 R L)
+                    , (1000, step 1000 1000 R L)
+                    ]
+                      (dec 6 - 1)
+
+-- | Like 'shortScale1' with the difference that all scale elements
+-- are masculine.
+shortScale1_pt :: (Integral a) => Rule a
+shortScale1_pt = mulScale1_es 3 3 R L BN.rule
+    where
+      mulScale1_es = mulScale_ $ \f m s _ -> masculineMul (f m) s
+      masculineMul x y = ChangeGender (Just Masculine) $ Mul x y
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \inf n -> M.lookup n (syms inf)
+               , reprScale = shortScaleRepr
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               , reprNeg   = Just $ \_ _ -> "menos "
+               }
+    where
+      (Lit 10 ⊞ Lit n ) _
+          | n < 8          = "as"
+          | n == 8         = ""
+          | otherwise      = "a"
+      (Lit _  ⊞ Lit 10) _ = ""
+      (_      ⊞ _     ) _ = " e "
+
+
+      (_ ⊡ Lit 10 ) _ = ""
+      (_ ⊡ Lit 100) _ = ""
+      (_ ⊡ _      ) _ = " "
+
+      syms inf =
+          M.fromList
+          [ (0, const "zero")
+          , (1, \c -> case c of
+                       CtxAdd _ (Lit 10) _  -> "on"
+                       _ | isFeminine inf   -> "uma"
+                         | otherwise        -> "um"
+            )
+          , (2, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "do"
+                       CtxMul _ (Lit 10)  _ -> "vin"
+                       CtxMul _ (Lit 100) _ -> "duz"
+                       _ | isFeminine inf   -> "duas"
+                         | otherwise        -> "dois"
+            )
+          , (3, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "tre"
+                       CtxMul _ (Lit 10)  _ -> "trin"
+                       CtxMul _ (Lit 100) _ -> "trez"
+                       _                    -> "três"
+            )
+          , (4, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "cator"
+                       CtxMul _ (Lit 10)  _ -> "quaren"
+                       _                    -> "quatro"
+            )
+          , (5, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "quin"
+                       CtxMul _ (Lit 10)  _ -> "cinquen"
+                       CtxMul _ (Lit 100) _ -> "quin"
+                       _                    -> "cinco"
+            )
+          , (6, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "sessen"
+                       _                   -> "seis"
+            )
+          , (7, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "seten"
+                       _                   -> "sete"
+            )
+          , (8, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "oiten"
+                       _                   -> "oito"
+            )
+          , (9, \c -> case c of
+                       CtxMul _ (Lit 10) _ -> "noven"
+                       _                   -> "nove"
+            )
+          , (10, \c -> case c of
+                        CtxAdd R (Lit _) _ -> "ze"
+                        CtxMul R (Lit 2) _ -> "te"
+                        CtxMul R (Lit _) _ -> "ta"
+                        _                  -> "dez"
+            )
+          , (100, \c -> case c of
+                         CtxAdd {} -> "cento"
+                         CtxMul _ (Lit n) _
+                             | n <= 3 -> if isFeminine inf then "entas"  else "entos"
+                             | n == 5 -> if isFeminine inf then "hentas" else "hentos"
+                             | n <= 9 -> if isFeminine inf then "centas" else "centos"
+                             | otherwise -> "cem"
+                         _ -> "cem"
+            )
+          , (1000, const "mil")
+          ]
+
+ordinalRepr :: Inflection -> Exp -> Maybe Text
+ordinalRepr = render defaultRepr
+              { reprValue = \inf n -> M.lookup n (syms inf)
+              , reprScale = shortScaleRepr
+              , reprAdd   = Just (⊞)
+              , reprMul   = Just (⊡)
+              , reprNeg   = Just $ \_ _ -> "menos "
+              }
+    where
+      (Lit _  ⊞ Lit 10) _ = ""
+      (_      ⊞ _     ) _ = " "
+
+      (_ ⊡ Lit 10 ) _ = ""
+      (_ ⊡ Lit 100) _ = ""
+      (_ ⊡ _      ) _ = " "
+
+      syms inf =
+          M.fromList
+          [ (0, const "zero")
+          , (1, \c -> case c of
+                       _ -> "primeir" <> postFix
+            )
+          , (2, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "vi"
+                       CtxMul _ (Lit 100) _ -> "du"
+                       _                    -> "segund" <> postFix
+            )
+          , (3, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "tri"
+                       CtxMul _ (Lit 100) _ -> "tre"
+                       _                    -> "terceir" <> postFix
+            )
+          , (4, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "quadra"
+                       CtxMul _ (Lit 100) _ -> "quadrin"
+                       _                    -> "quart" <> postFix
+            )
+          , (5, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "qüinqua"
+                       CtxMul _ (Lit 100) _ -> "qüin"
+                       _                    -> "quint" <> postFix
+            )
+          , (6, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "sexa"
+                       CtxMul _ (Lit 100) _ -> "sex"
+                       _                    -> "sext" <> postFix
+            )
+          , (7, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "septua"
+                       CtxMul _ (Lit 100) _ -> "setin"
+                       _                    -> "sétim" <> postFix
+            )
+          , (8, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "octo"
+                       CtxMul _ (Lit 100) _ -> "octin"
+                       _                    -> "oitav" <> postFix
+            )
+          , (9, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "nona"
+                       CtxMul _ (Lit 100) _ -> "non"
+                       _                    -> "non" <> postFix
+            )
+          , (10, \c -> case c of
+                        CtxAdd R (Lit _) _  -> "ze"
+                        CtxMul R (Lit _) _
+                            | isOutside R c -> "gésim" <> postFix
+                            | otherwise     -> "gésimo"
+                        _ | isOutside R c   -> "décim" <> postFix
+                          | otherwise       -> "décimo"
+            )
+          , (100, \c -> case c of
+                         CtxAdd {}         -> "cento"
+                         CtxMul _ (Lit n) _
+                             | not (n `elem` [2,3,6]) -> "gentésim" <> postFix
+                         _                            -> "centésim" <> postFix
+            )
+          , (1000, const $ "milésim" <> postFix)
+          ]
+          where
+            postFix = if isFeminine inf
+                      then if isSingular inf
+                           then "a"
+                           else "as"
+                      else if isSingular inf
+                           then "o"
+                           else "os"
+
+shortScaleRepr :: Inflection -> Integer -> Integer -> Exp -> Ctx Exp -> Maybe Text
+shortScaleRepr =
+    BN.scaleRepr (BN.quantityName "ilhão" "ilhões")
+                 [(4, BN.forms "quatr" "quator" "quator" "quatra" "quatri")]
diff --git a/src/Text/Numeral/Language/PT.hs b/src/Text/Numeral/Language/PT.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/PT.hs
+++ /dev/null
@@ -1,308 +0,0 @@
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        pt
-
-[@ISO639-2@]        por
-
-[@ISO639-3@]        por
-
-[@Native name@]     Português
-
-[@English name@]    Portuguese
--}
-
-module Text.Numeral.Language.PT
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-    , ordinal
-      -- * Structure
-    , cardinal_struct
-    , ordinal_struct
-      -- * Bounds
-    , bounds
-    ) where
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( (<) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.List.Unicode     ( (∉) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤) )
-import "base-unicode-symbols" Prelude.Unicode       ( ℤ )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum  as BN
-import qualified "this" Text.Numeral.Exp     as E
-import           "this" Text.Numeral.Grammar as G
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
--------------------------------------------------------------------------------
--- PT
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "pt"
-    , entIso639_2    = ["por"]
-    , entIso639_3    = Just "por"
-    , entNativeNames = ["Português"]
-    , entEnglishName = Just "Portuguese"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = cardinal_struct
-                       }
-    , entOrdinal     = Just Conversion
-                       { toNumeral   = ordinal
-                       , toStructure = ordinal_struct
-                       }
-    }
-
-cardinal ∷ (G.Feminine i, G.Masculine i, Integral α, E.Scale α)
-         ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ cardinal_struct
-
-ordinal ∷ (G.Feminine i, G.Masculine i, G.Singular i, Integral α, E.Scale α)
-         ⇒ i → α → Maybe Text
-ordinal inf = ordinalRepr inf ∘ ordinal_struct
-
-cardinal_struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         , E.Inflection β, G.Masculine (E.Inf β)
-         )
-       ⇒ α → β
-cardinal_struct = pos $ fix $ rule `combine` shortScale1_pt
-    where
-      rule = findRule (   0, lit       )
-                    [ (  11, add 10 L  )
-                    , (  16, add 10 R  )
-                    , (  20, mul 10 R L)
-                    , ( 100, step  100   10 R L)
-                    , (1000, step 1000 1000 R L)
-                    ]
-                      (dec 6 - 1)
-
-ordinal_struct ∷ ( Integral α, E.Scale α
-                 , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-                 , E.Inflection β, G.Masculine (E.Inf β)
-                 )
-                 ⇒ α → β
-ordinal_struct = pos $ fix $ rule `combine` shortScale1_pt
-    where
-      rule = findRule (   0, lit       )
-                    [ (  11, add 10 R  )
-                    , (  20, mul 10 R L)
-                    , ( 100, step  100   10 R L)
-                    , (1000, step 1000 1000 R L)
-                    ]
-                      (dec 6 - 1)
-
--- | Like 'shortScale1' with the difference that all scale elements
--- are masculine.
-shortScale1_pt ∷ ( Integral α, E.Scale α
-                , E.Unknown β, E.Lit β, E.Add β, E.Mul β, E.Scale β
-                , E.Inflection β, G.Masculine (E.Inf β)
-                )
-              ⇒ Rule α β
-shortScale1_pt = mulScale1_es 3 3 R L BN.rule
-    where
-      mulScale1_es = mulScale_ $ \f m s _ → masculineMul (f m) s
-      masculineMul x y = E.inflection (G.masculine) $ E.mul x y
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-cardinalRepr ∷ (G.Feminine i) ⇒ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \inf n → M.lookup n (syms inf)
-               , reprScale = shortScaleRepr
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               , reprNeg   = Just $ \_ _ → "menos "
-               }
-    where
-      (Lit 10 ⊞ Lit n ) _ | n < 8     = "as"
-                          | n ≡ 8     = ""
-                          | otherwise = "a"
-      (Lit _  ⊞ Lit 10) _             = ""
-      (_      ⊞ _     ) _             = " e "
-
-
-      (_ ⊡ Lit 10 ) _ = ""
-      (_ ⊡ Lit 100) _ = ""
-      (_ ⊡ _      ) _ = " "
-
-      syms inf =
-          M.fromList
-          [ (0, const "zero")
-          , (1, \c → case c of
-                       CtxAdd _ (Lit 10) _  → "on"
-                       _ | G.isFeminine inf → "uma"
-                         | otherwise        → "um"
-            )
-          , (2, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "do"
-                       CtxMul _ (Lit 10)  _ → "vin"
-                       CtxMul _ (Lit 100) _ → "duz"
-                       _ | G.isFeminine inf → "duas"
-                         | otherwise        → "dois"
-            )
-          , (3, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "tre"
-                       CtxMul _ (Lit 10)  _ → "trin"
-                       CtxMul _ (Lit 100) _ → "trez"
-                       _                    → "três"
-            )
-          , (4, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "cator"
-                       CtxMul _ (Lit 10)  _ → "quaren"
-                       _                    → "quatro"
-            )
-          , (5, \c → case c of
-                       CtxAdd _ (Lit 10)  _ → "quin"
-                       CtxMul _ (Lit 10)  _ → "cinquen"
-                       CtxMul _ (Lit 100) _ → "quin"
-                       _                    → "cinco"
-            )
-          , (6, \c → case c of
-                       CtxMul _ (Lit 10) _ → "sessen"
-                       _                   → "seis"
-            )
-          , (7, \c → case c of
-                       CtxMul _ (Lit 10) _ → "seten"
-                       _                   → "sete"
-            )
-          , (8, \c → case c of
-                       CtxMul _ (Lit 10) _ → "oiten"
-                       _                   → "oito"
-            )
-          , (9, \c → case c of
-                       CtxMul _ (Lit 10) _ → "noven"
-                       _                   → "nove"
-            )
-          , (10, \c → case c of
-                        CtxAdd R (Lit _) _ → "ze"
-                        CtxMul R (Lit 2) _ → "te"
-                        CtxMul R (Lit _) _ → "ta"
-                        _                  → "dez"
-            )
-          , (100, \c → case c of
-                         CtxAdd {} → "cento"
-                         CtxMul _ (Lit n) _
-                             | n ≤ 3 → if G.isFeminine inf then "entas"  else "entos"
-                             | n ≡ 5 → if G.isFeminine inf then "hentas" else "hentos"
-                             | n ≤ 9 → if G.isFeminine inf then "centas" else "centos"
-                             | otherwise → "cem"
-                         _ → "cem"
-            )
-          , (1000, const "mil")
-          ]
-
-ordinalRepr ∷ (G.Feminine i, G.Singular i) ⇒ i → Exp i → Maybe Text
-ordinalRepr = render defaultRepr
-              { reprValue = \inf n → M.lookup n (syms inf)
-              , reprScale = shortScaleRepr
-              , reprAdd   = Just (⊞)
-              , reprMul   = Just (⊡)
-              , reprNeg   = Just $ \_ _ → "menos "
-              }
-    where
-      (Lit _  ⊞ Lit 10) _ = ""
-      (_      ⊞ _     ) _ = " "
-
-      (_ ⊡ Lit 10 ) _ = ""
-      (_ ⊡ Lit 100) _ = ""
-      (_ ⊡ _      ) _ = " "
-
-      syms inf =
-          M.fromList
-          [ (0, const "zero")
-          , (1, \c → case c of
-                       _ → "primeir" ⊕ postFix
-            )
-          , (2, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "vi"
-                       CtxMul _ (Lit 100) _ → "du"
-                       _                    → "segund" ⊕ postFix
-            )
-          , (3, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "tri"
-                       CtxMul _ (Lit 100) _ → "tre"
-                       _                    → "terceir" ⊕ postFix
-            )
-          , (4, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "quadra"
-                       CtxMul _ (Lit 100) _ → "quadrin"
-                       _                    → "quart" ⊕ postFix
-            )
-          , (5, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "qüinqua"
-                       CtxMul _ (Lit 100) _ → "qüin"
-                       _                    → "quint" ⊕ postFix
-            )
-          , (6, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "sexa"
-                       CtxMul _ (Lit 100) _ → "sex"
-                       _                    → "sext" ⊕ postFix
-            )
-          , (7, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "septua"
-                       CtxMul _ (Lit 100) _ → "setin"
-                       _                    → "sétim" ⊕ postFix
-            )
-          , (8, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "octo"
-                       CtxMul _ (Lit 100) _ → "octin"
-                       _                    → "oitav" ⊕ postFix
-            )
-          , (9, \c → case c of
-                       CtxMul _ (Lit 10)  _ → "nona"
-                       CtxMul _ (Lit 100) _ → "non"
-                       _                    → "non" ⊕ postFix
-            )
-          , (10, \c → case c of
-                        CtxAdd R (Lit _) _  → "ze"
-                        CtxMul R (Lit _) _
-                            | isOutside R c → "gésim" ⊕ postFix
-                            | otherwise     → "gésimo"
-                        _ | isOutside R c   → "décim" ⊕ postFix
-                          | otherwise       → "décimo"
-            )
-          , (100, \c → case c of
-                         CtxAdd {}         → "cento"
-                         CtxMul _ (Lit n) _
-                             | n ∉ [2,3,6] → "gentésim" ⊕ postFix
-                         _                 → "centésim" ⊕ postFix
-            )
-          , (1000, const $ "milésim" ⊕ postFix)
-          ]
-          where
-            postFix = if G.isFeminine inf
-                      then if G.isSingular inf
-                           then "a"
-                           else "as"
-                      else if G.isSingular inf
-                           then "o"
-                           else "os"
-
-shortScaleRepr ∷ i → ℤ → ℤ → Exp i → Ctx (Exp i) → Maybe Text
-shortScaleRepr =
-    BN.scaleRepr (BN.quantityName "ilhão" "ilhões")
-                 [(4, BN.forms "quatr" "quator" "quator" "quatra" "quatri")]
diff --git a/src/Text/Numeral/Language/RU.hs b/src/Text/Numeral/Language/RU.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/RU.hs
+++ /dev/null
@@ -1,169 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        ru
-
-[@ISO639-2@]        rus
-
-[@ISO639-3@]        rus
-
-[@Native name@]     Русский язык
-
-[@English name@]    Russian
--}
-
-module Text.Numeral.Language.RU
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( (<), (>) )
-import "base" Prelude       ( Integral, (-), negate )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≤), (≥) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- RU
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "ru"
-    , entIso639_2    = ["rus"]
-    , entIso639_3    = Just "rus"
-    , entNativeNames = ["Русский язык"]
-    , entEnglishName = Just "Russian"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β) ⇒ α → β
-struct = pos
-       $ fix
-       $ findRule (   0, lit               )
-                [ (  11, add 10 L          )
-                , (  20, mul 10 R L        )
-                , (  40, lit               )
-                , (  41, add 40 R          )
-                , (  50, mul 10 R L        )
-                , ( 100, step  100   10 R L)
-                , (1000, step 1000 1000 R L)
-                ]
-                  (dec 6 - 1)
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 6 - 1 in (negate x, x)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               , reprNeg   = Just $ \_ _ → "минус "
-               }
-    where
-      (Lit n ⊞ Lit 10) _ | n < 10 = "на"
-      (_     ⊞ _     ) _          = " "
-
-      (_ ⊡ Lit n) _ | n ≤ 100 = ""
-      (_ ⊡ _    ) _           = " "
-
-      syms =
-          M.fromList
-          [ (0, const "ноль")
-          , (1, \c → case c of
-                       CtxAdd _ (Lit 40)    (CtxMul {}) → "одна"
-                       CtxAdd _ (_ `Mul` _) (CtxMul {}) → "одна"
-                       _                                → "один"
-            )
-          , (2, \c → case c of
-                       CtxAdd _ (Lit 10)    _           → "две"
-                       CtxAdd _ (Lit 40)    (CtxMul {}) → "две"
-                       CtxAdd _ (_ `Mul` _) (CtxMul {}) → "две"
-                       CtxMul _ (Lit n)     _ | n > 10  → "две"
-                       _                                → "два"
-            )
-          , (3, const "три")
-          , (4, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "четыр"
-                       _                   → "четыре"
-            )
-          , (5, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "пят"
-                       _                   → "пять"
-            )
-          , (6, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "шест"
-                       _                   → "шесть"
-            )
-          , (7, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "сем"
-                       _                   → "семь"
-            )
-          , (8, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "восем"
-                       _                   → "восемь"
-            )
-          , (9, \c → case c of
-                       CtxAdd _ (Lit 10) _ → "девят"
-                       CtxMul _ (Lit 10) _ → "девя"
-                       _                   → "девять"
-            )
-          , (10, \c → case c of
-                        CtxAdd _ (Lit n) _ | n ≤ 9 → "дцать"
-                        CtxMul _ (Lit n) _ | n < 4 → "дцать"
-                                           | n < 9 → "десят"
-                                           | n ≡ 9 → "носто"
-                        _                          → "десять"
-            )
-          , (40, const "сорок")
-          , (100, \c → case c of
-                         CtxMul _ (Lit n) _ | n ≡ 2 → "сти"
-                                            | n ≤ 4 → "ста"
-                                            | n ≤ 9 → "сот"
-                         _                          → "сто"
-            )
-          , (1000, \c → case c of
-                          CtxMul _ (Lit 40    `Add` Lit n) _ | n ≡ 1 → "тысяча"
-                                                             | n ≤ 4 → "тысячи"
-                                                             | n ≥ 5 → "тысяч"
-                          CtxMul _ (_ `Mul` _ `Add` Lit n) _ | n ≡ 1 → "тысяча"
-                                                             | n ≤ 4 → "тысячи"
-                                                             | n ≥ 5 → "тысяч"
-                          CtxMul _ (Lit n) _ | n ≤ 4 → "тысячи"
-                          CtxMul {}                  → "тысяч"
-                          _                          → "тысяча"
-            )
-          , (dec 6, const "миллион")
-          , (dec 9, const "миллиард")
-          ]
diff --git a/src/Text/Numeral/Language/RUS.hs b/src/Text/Numeral/Language/RUS.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/RUS.hs
@@ -0,0 +1,156 @@
+{-|
+[@ISO639-1@]        ru
+
+[@ISO639-2@]        rus
+
+[@ISO639-3@]        rus
+
+[@Native name@]     Русский язык
+
+[@English name@]    Russian
+-}
+
+module Text.Numeral.Language.RUS
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- RUS
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "ru"
+    , entIso639_2    = ["rus"]
+    , entIso639_3    = Just "rus"
+    , entNativeNames = ["Русский язык"]
+    , entEnglishName = Just "Russian"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = pos
+       $ fix
+       $ findRule (   0, lit               )
+                [ (  11, add 10 L          )
+                , (  20, mul 10 R L        )
+                , (  40, lit               )
+                , (  41, add 40 R          )
+                , (  50, mul 10 R L        )
+                , ( 100, step  100   10 R L)
+                , (1000, step 1000 1000 R L)
+                ]
+                  (dec 6 - 1)
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 6 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               , reprNeg   = Just $ \_ _ -> "минус "
+               }
+    where
+      (Lit n ⊞ Lit 10) _ | n < 10 = "на"
+      (_     ⊞ _     ) _          = " "
+
+      (_ ⊡ Lit n) _ | n <= 100 = ""
+      (_ ⊡ _    ) _            = " "
+
+      syms =
+          M.fromList
+          [ (0, const "ноль")
+          , (1, \c -> case c of
+                       CtxAdd _ (Lit 40)    (CtxMul {}) -> "одна"
+                       CtxAdd _ (_ `Mul` _) (CtxMul {}) -> "одна"
+                       _                                -> "один"
+            )
+          , (2, \c -> case c of
+                       CtxAdd _ (Lit 10)    _           -> "две"
+                       CtxAdd _ (Lit 40)    (CtxMul {}) -> "две"
+                       CtxAdd _ (_ `Mul` _) (CtxMul {}) -> "две"
+                       CtxMul _ (Lit n)     _ | n > 10  -> "две"
+                       _                                -> "два"
+            )
+          , (3, const "три")
+          , (4, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "четыр"
+                       _                   -> "четыре"
+            )
+          , (5, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "пят"
+                       _                   -> "пять"
+            )
+          , (6, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "шест"
+                       _                   -> "шесть"
+            )
+          , (7, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "сем"
+                       _                   -> "семь"
+            )
+          , (8, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "восем"
+                       _                   -> "восемь"
+            )
+          , (9, \c -> case c of
+                       CtxAdd _ (Lit 10) _ -> "девят"
+                       CtxMul _ (Lit 10) _ -> "девя"
+                       _                   -> "девять"
+            )
+          , (10, \c -> case c of
+                        CtxAdd _ (Lit n) _ | n <= 9 -> "дцать"
+                        CtxMul _ (Lit n) _ | n <  4 -> "дцать"
+                                           | n <  9 -> "десят"
+                                           | n == 9 -> "носто"
+                        _                           -> "десять"
+            )
+          , (40, const "сорок")
+          , (100, \c -> case c of
+                         CtxMul _ (Lit n) _ | n == 2 -> "сти"
+                                            | n <= 4 -> "ста"
+                                            | n <= 9 -> "сот"
+                         _                           -> "сто"
+            )
+          , (1000, \c -> case c of
+                          CtxMul _ (Lit 40    `Add` Lit n) _ | n == 1 -> "тысяча"
+                                                             | n <= 4 -> "тысячи"
+                                                             | n >= 5 -> "тысяч"
+                          CtxMul _ (_ `Mul` _ `Add` Lit n) _ | n == 1 -> "тысяча"
+                                                             | n <= 4 -> "тысячи"
+                                                             | n >= 5 -> "тысяч"
+                          CtxMul _ (Lit n) _ | n <= 4 -> "тысячи"
+                          CtxMul {}                   -> "тысяч"
+                          _                           -> "тысяча"
+            )
+          , (dec 6, const "миллион")
+          , (dec 9, const "миллиард")
+          ]
diff --git a/src/Text/Numeral/Language/SCO.hs b/src/Text/Numeral/Language/SCO.hs
--- a/src/Text/Numeral/Language/SCO.hs
+++ b/src/Text/Numeral/Language/SCO.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        -
 
@@ -31,14 +26,9 @@
 -- Imports
 -------------------------------------------------------------------------------
 
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
+import "base" Data.Function ( fix )
 import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
+import "this" Text.Numeral
 import "this" Text.Numeral.Entry
 import "text" Data.Text ( Text )
 
@@ -47,7 +37,7 @@
 -- SCO
 -------------------------------------------------------------------------------
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_2    = ["sco"]
     , entIso639_3    = Just "sco"
@@ -59,10 +49,10 @@
                        }
     }
 
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
+struct :: (Integral a) => a -> Exp
 struct = checkPos
        $ fix
        $ findRule (  1, lit       )
@@ -72,14 +62,14 @@
                 ]
                    100
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = (1, 100)
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
+               { reprValue = \_ n -> M.lookup n syms
                , reprAdd   = Just (⊞)
-               , reprMul   = Just $ \_ _ _ → ""
+               , reprMul   = Just $ \_ _ _ -> ""
                }
     where
       ((_ `Mul` _) ⊞ _) _ = " "
@@ -96,10 +86,10 @@
           , (7, tenForms "seeven" "seiven" "seeven")
           , (8, tenForms "echt"   "ech"    "ech"   )
           , (9, tenForms "nine"   "nin"    "nin"   )
-          , (10, \c → case c of
-                        CtxAdd {} → "teen"
-                        CtxMul {} → "tie"
-                        _         → "ten"
+          , (10, \c -> case c of
+                        CtxAdd {} -> "teen"
+                        CtxMul {} -> "tie"
+                        _         -> "ten"
             )
           , (11, const "aleeven")
           , (12, const "twal")
@@ -107,7 +97,7 @@
           , (1000, const "thousant")
           ]
 
-      tenForms o a m = \c → case c of
-                              CtxAdd L _ _ → a
-                              CtxMul {}    → m
-                              _            → o
+      tenForms o a m = \c -> case c of
+                              CtxAdd L _ _ -> a
+                              CtxMul {}    -> m
+                              _            -> o
diff --git a/src/Text/Numeral/Language/SPA.hs b/src/Text/Numeral/Language/SPA.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/SPA.hs
@@ -0,0 +1,181 @@
+{-|
+[@ISO639-1@]        es
+
+[@ISO639-2B@]       spa
+
+[@ISO639-3@]        spa
+
+[@Native name@]     Español
+
+[@English name@]    Spanish
+-}
+
+module Text.Numeral.Language.SPA
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum  as BN
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- SPA
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "es"
+    , entIso639_2    = ["spa"]
+    , entIso639_3    = Just "spa"
+    , entNativeNames = ["Español"]
+    , entEnglishName = Just "Spanish"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = pos $ fix $ rule `combine` longScale1_es
+    where
+      rule = findRule (   0, lit       )
+                    [ (  11, add 10 L  )
+                    , (  16, add 10 R  )
+                    , (  20, lit       )
+                    , (  21, add 20 R  )
+                    , (  30, mul 10 R L)
+                    , ( 100, step  100   10 R L)
+                    , (1000, step 1000 1000 R L)
+                    ]
+                    (dec 6 - 1)
+
+-- | Like 'longScale1' with the difference that all scale elements are
+-- masculine.
+longScale1_es :: (Integral a) => Rule a
+longScale1_es = mulScale1_es 6 0 R L BN.rule
+    where
+      mulScale1_es = mulScale_ $ \f m s _ -> masculineMul (f m) s
+      masculineMul x y = ChangeGender (Just Masculine) $ Mul x y
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \inf n -> M.lookup n (syms inf)
+               , reprScale = longScaleRepr
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               , reprNeg   = Just $ \_ _ -> "menos "
+               }
+    where
+      (_                    ⊞ Lit 10) _ = ""
+      (Lit 10               ⊞ _     ) _ = ""
+      (Lit 20               ⊞ _     ) _ = ""
+      ((Lit _ `Mul` Lit 10) ⊞ _     ) _ = " y "
+      (_                    ⊞ _     ) _ = " "
+
+      (_ ⊡ Lit n) _ | n < 1000 = ""
+      (_ ⊡ _    ) _            = " "
+
+      syms inf =
+          M.fromList
+          [ (0, const "cero")
+          , (1, \c -> case c of
+                       CtxAdd _ (Lit 10)  _  -> "on"
+                       CtxAdd _ (Lit 20)  _
+                           | isMasculine inf -> "ún"
+                       _   | isFeminine  inf -> "una"
+                           | isMasculine inf -> "un"
+                           | otherwise       -> "uno"
+            )
+          , (2, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "do"
+                       CtxAdd _ (Lit 20)  _ -> "dós"
+                       _                    -> "dos"
+            )
+          , (3, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "tre"
+                       CtxAdd _ (Lit 20)  _ -> "trés"
+                       CtxMul _ (Lit 10)  _ -> "trein"
+                       _                    -> "tres"
+            )
+          , (4, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "cator"
+                       CtxMul _ (Lit 10)  _ -> "cuaren"
+                       _                    -> "cuatro"
+            )
+          , (5, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "quin"
+                       CtxMul _ (Lit 10)  _ -> "cincuen"
+                       CtxMul _ (Lit 100) _ -> "quin"
+                       _                    -> "cinco"
+            )
+          , (6, \c -> case c of
+                       CtxAdd _ (Lit 10)  _ -> "séis"
+                       CtxAdd _ (Lit 20)  _ -> "séis"
+                       CtxMul _ (Lit 10)  _ -> "sesen"
+                       _                    -> "seis"
+            )
+          , (7, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "seten"
+                       CtxMul _ (Lit 100) _ -> "sete"
+                       _                    -> "siete"
+            )
+          , (8, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "ochen"
+                       _                    -> "ocho"
+            )
+          , (9, \c -> case c of
+                       CtxMul _ (Lit 10)  _ -> "noven"
+                       CtxMul _ (Lit 100) _ -> "nove"
+                       _                    -> "nueve"
+            )
+          , (10, \c -> case c of
+                        CtxAdd R (Lit _)  _ -> "ce"
+                        CtxAdd L (Lit _)  _ -> "dieci"
+                        CtxMul R _        _ -> "ta"
+                        _                   -> "diez"
+            )
+          , (20, \c -> case c of
+                        CtxAdd _ (Lit _)  _ -> "veinti"
+                        _                   -> "veinte"
+            )
+          , (100, \c -> case c of
+                         CtxEmpty           -> "cien"
+                         CtxAdd {}          -> "ciento"
+                         CtxMul _ (Lit 5) _
+                           | isFeminine inf -> "ientas"
+                           | otherwise      -> "ientos"
+                         CtxMul L _       _ -> "cien"
+                         _ | isFeminine inf -> "cientas"
+                           | otherwise      -> "cientos"
+            )
+          , (1000, const "mil")
+          ]
+
+longScaleRepr :: Inflection -> Integer -> Integer -> Exp -> Ctx Exp -> Maybe Text
+longScaleRepr =
+    BN.scaleRepr (BN.quantityName "illón" "illones")
+                 [ (4, BN.forms "cuatr" "cuator" "cuator" "cuatra" "cuatri")
+                 , (9, BN.forms "non"   "noven"  "noven"  "nona"   "non")
+                 ]
diff --git a/src/Text/Numeral/Language/SV.hs b/src/Text/Numeral/Language/SV.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/SV.hs
+++ /dev/null
@@ -1,223 +0,0 @@
-{-# LANGUAGE FlexibleContexts  #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        sv
-
-[@ISO639-2B@]       swe
-
-[@ISO639-3@]        swe
-
-[@Native name@]     svenska
-
-[@English name@]    Swedish
--}
-
-module Text.Numeral.Language.SV
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-    , ordinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
--------------------------------------------------------------------------------
--- Imports
--------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Num, Integral, (-), div, negate, even )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum as BN
-import qualified "this" Text.Numeral.Exp    as E
-import qualified "this" Text.Numeral.Grammar as G
-import           "this" Text.Numeral.Misc ( dec, intLog )
-import "this" Text.Numeral.Entry
-import "this" Text.Numeral.Render.Utils ( addCtx, mulCtx, outsideCtx )
-import "text" Data.Text ( Text )
-
-
--------------------------------------------------------------------------------
--- SV
--------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "sv"
-    , entIso639_2    = ["swe"]
-    , entIso639_3    = Just "swe"
-    , entNativeNames = ["svenska"]
-    , entEnglishName = Just "Swedish"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    , entOrdinal     = Just Conversion
-                       { toNumeral   = ordinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (G.Common i, G.Neuter i, Integral α, E.Scale α)
-         ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-ordinal ∷ (G.Common i, G.Neuter i, Integral α, E.Scale α)
-        ⇒ i → α → Maybe Text
-ordinal inf = ordinalRepr inf ∘ struct
-
-struct ∷ ( Integral α, E.Scale α
-         , E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Scale β
-         , E.Inflection β, G.Common (E.Inf β)
-         )
-       ⇒ α → β
-struct = pos $ fix $ rule `combine` pelletierScale1_sv
-    where
-      rule = findRule (   0, lit       )
-                    [ (  13, add 10 L  )
-                    , (  20, lit       )
-                    , (  21, add 20 R  )
-                    , (  30, mul 10 R L)
-                    , ( 100, step1 100   10 R L)
-                    , (1000, step1 1000 1000 R L)
-                    ]
-                      (dec 6 - 1)
-
--- | Like 'pelletierScale1' with the difference that all scale
--- elements are of the common gender.
-pelletierScale1_sv ∷ ( Integral α, E.Scale α
-                     , E.Unknown β, E.Lit β, E.Add β, E.Mul β, E.Scale β
-                     , E.Inflection β, G.Common (E.Inf β)
-                     )
-                   ⇒ Rule α β
-pelletierScale1_sv =
-    conditional (\n → even $ intLog n `div` 3)
-                (mulScale1_sv 6 0 R L BN.rule)
-                (mulScale1_sv 6 3 R L BN.rule)
-  where
-    mulScale1_sv = mulScale_ $ \f m s _ → commonMul (f m) s
-    commonMul m s = E.inflection (G.common) $ E.mul m s
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-cardinalRepr ∷ (G.Common i, G.Neuter i) ⇒ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \ctx n → M.lookup n (syms ctx)
-               , reprScale = BN.pelletierRepr
-                               (BN.quantityName "iljon"  "iljoner")
-                               (BN.quantityName "iljard" "iljarder")
-                               bigNumSyms
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               , reprNeg   = Just $ \_ _   → "minus "
-               }
-    where
-      (Inflection _ _ ⊞ _) _ = " "
-      (_ ⊞ _) _ = ""
-
-      (_ ⊡ Lit  100) CtxEmpty = " "
-      (_ ⊡ Lit 1000) CtxEmpty = " "
-      (_ ⊡ Scale{})  _ = " "
-      (_ ⊡ _) _ = ""
-
-      syms ctx =
-          M.fromList
-          [ (0, const "noll")
-          , (1, \c → case c of
-                       CtxMul _ (Lit 1000) CtxEmpty → "ett"
-                       CtxMul _ (Lit 1000) _ → "et"
-                       _ | G.isCommon ctx → "en"
-                         | G.isNeuter ctx → "ett"
-                         | otherwise      → "?"
-            )
-          , (2, const "två")
-          , (3, addCtx 10 "tret" $ mulCtx 10 "tret" $ const "tre")
-          , (4, addCtx 10 "fjor" $ mulCtx 10 "fyr"  $ const "fyra")
-          , (5, const "fem")
-          , (6, const "sex")
-          , (7, addCtx 10 "sjut" $ mulCtx 10 "sjut" $ const "sju")
-          , (8, addCtx 10 "ar"   $ mulCtx 10 "åt"   $ const "åtta")
-          , (9, addCtx 10 "nit"  $ mulCtx 10 "nit"  $ const "nio")
-          , (10, \c → case c of
-                        CtxAdd {} → "ton"
-                        _         → "tio"
-            )
-          , (11, const "elva")
-          , (12, const "tolv")
-          , (20, const "tjugo")
-          , (100, const "hundra")
-          , (1000, const "tusen")
-          ]
-
-ordinalRepr ∷ (G.Common i, G.Neuter i) ⇒ i → Exp i → Maybe Text
-ordinalRepr = render defaultRepr
-              { reprValue = \ctx n → M.lookup n (syms ctx)
-              , reprScale = BN.pelletierRepr
-                               (BN.ordQuantityName "iljon"  "iljonte" "iljoner"  "iljonte")
-                               (BN.ordQuantityName "iljard" "iljarte" "iljarder" "iljarte")
-                               bigNumSyms
-              , reprAdd   = Just (⊞)
-              , reprMul   = Just (⊡)
-              , reprNeg   = Just $ \_ _   → "minus "
-              }
-    where
-      (Inflection _ _ ⊞ _) _ = " "
-      (_ ⊞ _) _ = ""
-
-      (_ ⊡ Lit  100) CtxEmpty = " "
-      (_ ⊡ Lit 1000) CtxEmpty = " "
-      (_ ⊡ Scale{})  _ = " "
-      (_ ⊡ _) _ = ""
-
-      syms ctx =
-          M.fromList
-          [ (0, outsideCtx R "nollte" $ const "noll")
-          , (1, outsideCtx R "första"
-                $ \c → case c of
-                         CtxMul _ (Lit 1000) CtxEmpty → "ett"
-                         CtxMul _ (Lit 1000) _ → "et"
-                         _ | G.isCommon ctx → "en"
-                           | G.isNeuter ctx → "ett"
-                           | otherwise      → "?"
-            )
-          , (2, outsideCtx R "andra"   $ const "två")
-          , (3, outsideCtx R "tredje"  $ addCtx 10 "tret" $ mulCtx 10 "tret" $ const "tre")
-          , (4, outsideCtx R "fjärde"  $ addCtx 10 "fjor" $ mulCtx 10 "fyr"  $ const "fyra")
-          , (5, outsideCtx R "femte"   $ const "fem")
-          , (6, outsideCtx R "sjätte"  $ const "sex")
-          , (7, outsideCtx R "sjunde"  $ addCtx 10 "sjut" $ mulCtx 10 "sjut" $ const "sju")
-          , (8, outsideCtx R "åttonde" $ addCtx 10 "ar"   $ mulCtx 10 "åt"   $ const "åtta")
-          , (9, outsideCtx R "nionde"  $ addCtx 10 "nit"  $ mulCtx 10 "nit"  $ const "nio")
-          , (10, \c → case c of
-                        CtxAdd {}
-                          | isOutside R c → "tonde"
-                          | otherwise     → "ton"
-                        _ | isOutside R c → "tionde"
-                          | otherwise     → "tio"
-            )
-          , (11, outsideCtx R "elfte"    $ const "elva")
-          , (12, outsideCtx R "tolfte"   $ const "tolv")
-          , (20, outsideCtx R "tjugonde" $ const "tjugo")
-          , (100, outsideCtx R "hundrade" $ const "hundra")
-          , (1000, outsideCtx R "tusende" $ const "tusen")
-          ]
-
-bigNumSyms ∷ (Num α) ⇒ [(α, Ctx (Exp i) → Text)]
-bigNumSyms =
-    [ (4, BN.forms "kvadr" "kvattuor" "kvattuor" "kvadra"  "kvadri")
-    , (5, BN.forms "kvint" "kvin"     "kvinkva"  "kvinkva" "kvin")
-    , (8, BN.forms "okt"   "okto"     "okto"     "okto"    "oktin")
-    ]
diff --git a/src/Text/Numeral/Language/SWE.hs b/src/Text/Numeral/Language/SWE.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/SWE.hs
@@ -0,0 +1,201 @@
+{-|
+[@ISO639-1@]        sv
+
+[@ISO639-2B@]       swe
+
+[@ISO639-3@]        swe
+
+[@Native name@]     svenska
+
+[@English name@]    Swedish
+-}
+
+module Text.Numeral.Language.SWE
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+    , ordinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+-------------------------------------------------------------------------------
+-- Imports
+-------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum as BN
+import           "this" Text.Numeral.Misc ( dec, intLog )
+import "this" Text.Numeral.Entry
+import "this" Text.Numeral.Render.Utils ( addCtx, mulCtx, outsideCtx )
+import "text" Data.Text ( Text )
+
+
+-------------------------------------------------------------------------------
+-- SWE
+-------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "sv"
+    , entIso639_2    = ["swe"]
+    , entIso639_3    = Just "swe"
+    , entNativeNames = ["svenska"]
+    , entEnglishName = Just "Swedish"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    , entOrdinal     = Just Conversion
+                       { toNumeral   = ordinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+ordinal :: (Integral a) => Inflection -> a -> Maybe Text
+ordinal inf = ordinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = pos $ fix $ rule `combine` pelletierScale1_sv
+    where
+      rule = findRule (   0, lit       )
+                    [ (  13, add 10 L  )
+                    , (  20, lit       )
+                    , (  21, add 20 R  )
+                    , (  30, mul 10 R L)
+                    , ( 100, step1 100   10 R L)
+                    , (1000, step1 1000 1000 R L)
+                    ]
+                      (dec 6 - 1)
+
+-- | Like 'pelletierScale1' with the difference that all scale
+-- elements are of the common gender.
+pelletierScale1_sv :: (Integral a) => Rule a
+pelletierScale1_sv =
+    conditional (\n -> even $ intLog n `div` 3)
+                (mulScale1_sv 6 0 R L BN.rule)
+                (mulScale1_sv 6 3 R L BN.rule)
+  where
+    mulScale1_sv = mulScale_ $ \f m s _ -> commonMul (f m) s
+    commonMul m s = ChangeGender (Just Common) $ Mul m s
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \ctx n -> M.lookup n (syms ctx)
+               , reprScale = BN.pelletierRepr
+                               (BN.quantityName "iljon"  "iljoner")
+                               (BN.quantityName "iljard" "iljarder")
+                               bigNumSyms
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               , reprNeg   = Just $ \_ _   -> "minus "
+               }
+    where
+      (ChangeGender _ _ ⊞ _) _ = " "
+      (_ ⊞ _) _ = ""
+
+      (_ ⊡ Lit  100) CtxEmpty = " "
+      (_ ⊡ Lit 1000) CtxEmpty = " "
+      (_ ⊡ Scale{})  _ = " "
+      (_ ⊡ _) _ = ""
+
+      syms ctx =
+          M.fromList
+          [ (0, const "noll")
+          , (1, \c -> case c of
+                       CtxMul _ (Lit 1000) CtxEmpty -> "ett"
+                       CtxMul _ (Lit 1000) _ -> "et"
+                       _ | isCommon ctx -> "en"
+                         | isNeuter ctx -> "ett"
+                         | otherwise    -> "?"
+            )
+          , (2, const "två")
+          , (3, addCtx 10 "tret" $ mulCtx 10 "tret" $ const "tre")
+          , (4, addCtx 10 "fjor" $ mulCtx 10 "fyr"  $ const "fyra")
+          , (5, const "fem")
+          , (6, const "sex")
+          , (7, addCtx 10 "sjut" $ mulCtx 10 "sjut" $ const "sju")
+          , (8, addCtx 10 "ar"   $ mulCtx 10 "åt"   $ const "åtta")
+          , (9, addCtx 10 "nit"  $ mulCtx 10 "nit"  $ const "nio")
+          , (10, \c -> case c of
+                        CtxAdd {} -> "ton"
+                        _         -> "tio"
+            )
+          , (11, const "elva")
+          , (12, const "tolv")
+          , (20, const "tjugo")
+          , (100, const "hundra")
+          , (1000, const "tusen")
+          ]
+
+ordinalRepr :: Inflection -> Exp -> Maybe Text
+ordinalRepr = render defaultRepr
+              { reprValue = \ctx n -> M.lookup n (syms ctx)
+              , reprScale = BN.pelletierRepr
+                               (BN.ordQuantityName "iljon" "iljonte" "iljoner" "iljonte")
+                               (BN.quantityName "iljard" "iljarder")
+                               bigNumSyms
+              , reprAdd   = Just (⊞)
+              , reprMul   = Just (⊡)
+              , reprNeg   = Just $ \_ _   -> "minus "
+              }
+    where
+      (ChangeGender _ _ ⊞ _) _ = " "
+      (_ ⊞ _) _ = ""
+
+      (_ ⊡ Lit  100) CtxEmpty = " "
+      (_ ⊡ Lit 1000) CtxEmpty = " "
+      (_ ⊡ Scale{})  _ = " "
+      (_ ⊡ _) _ = ""
+
+      syms ctx =
+          M.fromList
+          [ (0, outsideCtx R "nollte" $ const "noll")
+          , (1, outsideCtx R "första"
+                $ \c -> case c of
+                         CtxMul _ (Lit 1000) CtxEmpty -> "ett"
+                         CtxMul _ (Lit 1000) _ -> "et"
+                         _ | isCommon ctx -> "en"
+                           | isNeuter ctx -> "ett"
+                           | otherwise    -> "?"
+            )
+          , (2, outsideCtx R "andra"   $ const "två")
+          , (3, outsideCtx R "tredje"  $ addCtx 10 "tret" $ mulCtx 10 "tret" $ const "tre")
+          , (4, outsideCtx R "fjärde"  $ addCtx 10 "fjor" $ mulCtx 10 "fyr"  $ const "fyra")
+          , (5, outsideCtx R "femte"   $ const "fem")
+          , (6, outsideCtx R "sjätte"  $ const "sex")
+          , (7, outsideCtx R "sjunde"  $ addCtx 10 "sjut" $ mulCtx 10 "sjut" $ const "sju")
+          , (8, outsideCtx R "åttonde" $ addCtx 10 "ar"   $ mulCtx 10 "åt"   $ const "åtta")
+          , (9, outsideCtx R "nionde"  $ addCtx 10 "nit"  $ mulCtx 10 "nit"  $ const "nio")
+          , (10, \c -> case c of
+                        CtxAdd {}
+                          | isOutside R c -> "tonde"
+                          | otherwise     -> "ton"
+                        _ | isOutside R c -> "tionde"
+                          | otherwise     -> "tio"
+            )
+          , (11, outsideCtx R "elfte"    $ const "elva")
+          , (12, outsideCtx R "tolfte"   $ const "tolv")
+          , (20, outsideCtx R "tjugonde" $ const "tjugo")
+          , (100, outsideCtx R "hundrade" $ const "hundra")
+          , (1000, outsideCtx R "tusende" $ const "tusen")
+          ]
+
+bigNumSyms :: (Num a) => [(a, Ctx Exp -> Text)]
+bigNumSyms =
+    [ (4, BN.forms "kvadr" "kvattuor" "kvattuor" "kvadra"  "kvadri")
+    , (5, BN.forms "kvint" "kvin"     "kvinkva"  "kvinkva" "kvin")
+    , (8, BN.forms "okt"   "okto"     "okto"     "okto"    "oktin")
+    ]
diff --git a/src/Text/Numeral/Language/TR.hs b/src/Text/Numeral/Language/TR.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/TR.hs
+++ /dev/null
@@ -1,163 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        tr
-
-[@ISO639-2@]        tur
-
-[@ISO639-3@]        tur
-
-[@Native name@]     Türkçe
-
-[@English name@]    Turkish
--}
-
-module Text.Numeral.Language.TR
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Bool           ( otherwise )
-import "base" Data.Function       ( ($), const, fix )
-import "base" Data.Maybe          ( Maybe(Just) )
-import "base" Prelude             ( Integral, (-), divMod, negate )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.List.Unicode     ( (∉) )
-import "base-unicode-symbols" Prelude.Unicode       ( ℤ, (⋅) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.BigNum as BN ( rule, scaleRepr, forms )
-import qualified "this" Text.Numeral.Exp    as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- TR
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "tr"
-    , entIso639_2    = ["tur"]
-    , entIso639_3    = Just "tur"
-    , entNativeNames = ["Türkçe"]
-    , entEnglishName = Just "Turkish"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ (Integral α, E.Scale α, E.Unknown β, E.Lit β, E.Add β, E.Mul β, E.Scale β)
-       ⇒ α → β
-struct = checkPos $ fix $ rule `combine` shortScale1 R L BN.rule
-
-rule ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ Rule α β
-rule = findRule (   0, lit               )
-              [ (  11, addToTens         )
-              , ( 100, step  100   10 R L)
-              , (1000, step 1000 1000 R L)
-              ]
-                (dec 6 - 1)
-
-addToTens ∷ (Integral α, E.Lit β, E.Add β) ⇒ Rule α β
-addToTens f n = let (m, r) = n `divMod` 10
-                    tens   = m ⋅ 10
-                in if r ≡ 0
-                   then lit f tens
-                   else f tens `E.add` f r
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 60000 - 1 in (negate x, x)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprScale = scaleRepr
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just $ \_ _ _ → " "
-               }
-    where
-      (Lit 10 ⊞ _) (CtxMul {}) = ""
-      (_      ⊞ _) _           = " "
-
-      syms =
-          M.fromList
-          [ (0, const "sıfır")
-          , (1, const "bir")
-          , (2, const "iki")
-          , (3, const "üç")
-          , (4, const "dört")
-          , (5, const "beş")
-          , (6, const "altı")
-          , (7, const "yedi")
-          , (8, const "sekiz")
-          , (9, const "dokuz")
-          , (10, const "on")
-          , (20, const "yirmi")
-          , (30, const "otuz")
-          , (40, const "kırk")
-          , (50, const "elli")
-          , (60, const "altmış")
-          , (70, const "yetmiş")
-          , (80, const "seksen")
-          , (90, const "doksan")
-          , (100, const "yüz")
-          , (1000, const "bin")
-          ]
-
-scaleRepr ∷ i → ℤ → ℤ → Exp i → Ctx (Exp i) → Maybe Text
-scaleRepr = BN.scaleRepr
-              (\_ _ → "ilyon")
-              [ (1, BN.forms "m"     "an"     "an"     ""       "")
-              , (2, BN.forms "b"     "do"     "do"     "vi"     "du")
-              , (3, \c → case c of
-                           CtxAdd _ (Lit 10)  _ → "tre"
-                           CtxAdd _ (Lit 100) _ → "tre"
-                           CtxAdd {}            → "tres"
-                           CtxMul _ (Lit 100) _ → "tre"
-                           CtxMul {}            → "tri"
-                           _                    → "tr"
-                )
-              , (4, BN.forms "katr"  "kator"  "kator"  "katra"  "katrin")
-              , (5, BN.forms "kent"  "ken"    "kenka"  "kenka"  "ken")
-              , (6, BN.forms "sekst" "seks"   "ses"    "seksa"  "se")
-              , (7, BN.forms "sept"  "septen" "septem" "septe"  "septin")
-              , (8, BN.forms "okt"   "okto"   "okto"   "okto"   "oktin")
-              , (10, \c → case c of
-                            CtxAdd _ (Lit 100) _              → "desi"
-                            CtxAdd _ (Lit 1) (CtxAdd {})      → "desi"
-                            CtxMul _ (Lit n) (CtxAdd L (Lit 100) _)
-                                       | n ≡ 2     → "ginti"
-                                       | otherwise → "ginta"
-                            CtxMul _ (Lit _) (CtxAdd _ _ CtxEmpty) → "gint"
-                            CtxMul _ (Lit _) CtxEmpty         → "gint"
-                            CtxMul {}                         → "ginti"
-                            _                                 → "des"
-                )
-              , (100, \c → case c of
-                             CtxMul _ (Lit n) _ | n ∉ [2,3,6] → "gent"
-                             _                                → "sent"
-                )
-              ]
diff --git a/src/Text/Numeral/Language/TUR.hs b/src/Text/Numeral/Language/TUR.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/TUR.hs
@@ -0,0 +1,149 @@
+{-|
+[@ISO639-1@]        tr
+
+[@ISO639-2@]        tur
+
+[@ISO639-3@]        tur
+
+[@Native name@]     Türkçe
+
+[@English name@]    Turkish
+-}
+
+module Text.Numeral.Language.TUR
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import           "this" Text.Numeral
+import qualified "this" Text.Numeral.BigNum as BN ( rule, scaleRepr, forms )
+import           "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- TUR
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "tr"
+    , entIso639_2    = ["tur"]
+    , entIso639_3    = Just "tur"
+    , entNativeNames = ["Türkçe"]
+    , entEnglishName = Just "Turkish"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = checkPos $ fix $ rule `combine` shortScale1 R L BN.rule
+
+rule :: (Integral a) => Rule a
+rule = findRule (   0, lit               )
+              [ (  11, addToTens         )
+              , ( 100, step  100   10 R L)
+              , (1000, step 1000 1000 R L)
+              ]
+                (dec 6 - 1)
+
+addToTens :: (Integral a) => Rule a
+addToTens f n = let (m, r) = n `divMod` 10
+                    tens   = m * 10
+                in if r == 0
+                   then lit f tens
+                   else f tens `Add` f r
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 60000 - 1 in (negate x, x)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprScale = scaleRepr
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just $ \_ _ _ -> " "
+               }
+    where
+      (Lit 10 ⊞ _) (CtxMul {}) = ""
+      (_      ⊞ _) _           = " "
+
+      syms =
+          M.fromList
+          [ (0, const "sıfır")
+          , (1, const "bir")
+          , (2, const "iki")
+          , (3, const "üç")
+          , (4, const "dört")
+          , (5, const "beş")
+          , (6, const "altı")
+          , (7, const "yedi")
+          , (8, const "sekiz")
+          , (9, const "dokuz")
+          , (10, const "on")
+          , (20, const "yirmi")
+          , (30, const "otuz")
+          , (40, const "kırk")
+          , (50, const "elli")
+          , (60, const "altmış")
+          , (70, const "yetmiş")
+          , (80, const "seksen")
+          , (90, const "doksan")
+          , (100, const "yüz")
+          , (1000, const "bin")
+          ]
+
+scaleRepr :: Inflection -> Integer -> Integer -> Exp -> Ctx Exp -> Maybe Text
+scaleRepr = BN.scaleRepr
+              (\_ _ -> "ilyon")
+              [ (1, BN.forms "m"     "an"     "an"     ""       "")
+              , (2, BN.forms "b"     "do"     "do"     "vi"     "du")
+              , (3, \c -> case c of
+                           CtxAdd _ (Lit 10)  _ -> "tre"
+                           CtxAdd _ (Lit 100) _ -> "tre"
+                           CtxAdd {}            -> "tres"
+                           CtxMul _ (Lit 100) _ -> "tre"
+                           CtxMul {}            -> "tri"
+                           _                    -> "tr"
+                )
+              , (4, BN.forms "katr"  "kator"  "kator"  "katra"  "katrin")
+              , (5, BN.forms "kent"  "ken"    "kenka"  "kenka"  "ken")
+              , (6, BN.forms "sekst" "seks"   "ses"    "seksa"  "se")
+              , (7, BN.forms "sept"  "septen" "septem" "septe"  "septin")
+              , (8, BN.forms "okt"   "okto"   "okto"   "okto"   "oktin")
+              , (10, \c -> case c of
+                            CtxAdd _ (Lit 100) _              -> "desi"
+                            CtxAdd _ (Lit 1) (CtxAdd {})      -> "desi"
+                            CtxMul _ (Lit n) (CtxAdd L (Lit 100) _)
+                                       | n == 2    -> "ginti"
+                                       | otherwise -> "ginta"
+                            CtxMul _ (Lit _) (CtxAdd _ _ CtxEmpty) -> "gint"
+                            CtxMul _ (Lit _) CtxEmpty         -> "gint"
+                            CtxMul {}                         -> "ginti"
+                            _                                 -> "des"
+                )
+              , (100, \c -> case c of
+                             CtxMul _ (Lit n) _
+                               | not $ n `elem` [2,3,6] -> "gent"
+                             _                          -> "sent"
+                )
+              ]
diff --git a/src/Text/Numeral/Language/WO.hs b/src/Text/Numeral/Language/WO.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/WO.hs
+++ /dev/null
@@ -1,116 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        wo
-
-[@ISO639-2@]        wo1
-
-[@ISO639-3@]        wo1
-
-[@Native name@]     Wolof
-
-[@English name@]    Wolof
--}
-
-module Text.Numeral.Language.WO
-    ( -- * Language entry
-      entry
-      -- * Conversions
-    , cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≥) )
-import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- WO
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "wo"
-    , entIso639_2    = ["wol"]
-    , entIso639_3    = Just "wol"
-    , entNativeNames = ["Wolof"]
-    , entEnglishName = Just "Wolof"
-    , entCardinal    = Just Conversion
-                       { toNumeral   = cardinal
-                       , toStructure = struct
-                       }
-    }
-
-cardinal ∷ (Inflection i, Integral α, E.Scale α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
-
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β) ⇒ α → β
-struct = checkPos
-       $ fix
-       $ findRule (  0, lit        )
-                [ (  6, add 5 R    )
-                , ( 10, lit        )
-                , ( 11, add 10 R   )
-                , ( 20, mul 10 R L )
-                , (100,  step 100 10 R L)
-                , (1000, step 1000 1000 R L)
-                , (dec 6, lit)
-                ]
-                  (dec 6)
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = (0, dec 6)
-
-cardinalRepr ∷ i → Exp i → Maybe Text
-cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
-               , reprAdd   = Just (⊞)
-               , reprMul   = Just (⊡)
-               }
-    where
-      (Lit 5 ⊞ _) _ = "-"
-      (_     ⊞ _) _ = " ak "
-
-      (_ ⊡ Lit 10) _ = "-"
-      (_ ⊡ _     ) _ = " "
-
-      syms =
-          M.fromList
-          [ (0, const "tus")
-          , (1, i "benn")
-          , (2, i "ñaar")
-          , (3, i "ñett")
-          , (4, i "ñeent")
-          , (5, i "juróom")
-          , (10, i "fukk")
-          , (100, i "téeméer")
-          , (1000, const "junni")
-          , (dec 6, const "tamndareet")
-          ]
-
-      i s = \c → s ⊕ case c of
-                       CtxMul _ (Lit n) _ | n ≥ 100 → "i"
-                       CtxAdd R _ (CtxMul _ (Lit n) _) | n ≥ 100 → "i"
-                       _ → ""
diff --git a/src/Text/Numeral/Language/WOL.hs b/src/Text/Numeral/Language/WOL.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/WOL.hs
@@ -0,0 +1,105 @@
+{-|
+[@ISO639-1@]        wo
+
+[@ISO639-2@]        wo1
+
+[@ISO639-3@]        wo1
+
+[@Native name@]     Wolof
+
+[@English name@]    Wolof
+-}
+
+module Text.Numeral.Language.WOL
+    ( -- * Language entry
+      entry
+      -- * Conversions
+    , cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import "base" Data.Monoid ( (<>) )
+import qualified "containers" Data.Map as M ( fromList, lookup )
+import "this" Text.Numeral
+import "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- WOL
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "wo"
+    , entIso639_2    = ["wol"]
+    , entIso639_3    = Just "wol"
+    , entNativeNames = ["Wolof"]
+    , entEnglishName = Just "Wolof"
+    , entCardinal    = Just Conversion
+                       { toNumeral   = cardinal
+                       , toStructure = struct
+                       }
+    }
+
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
+
+struct :: (Integral a) => a -> Exp
+struct = checkPos
+       $ fix
+       $ findRule (  0, lit        )
+                [ (  6, add 5 R    )
+                , ( 10, lit        )
+                , ( 11, add 10 R   )
+                , ( 20, mul 10 R L )
+                , (100,  step 100 10 R L)
+                , (1000, step 1000 1000 R L)
+                , (dec 6, lit)
+                ]
+                  (dec 6)
+
+bounds :: (Integral a) => (a, a)
+bounds = (0, dec 6)
+
+cardinalRepr :: Inflection -> Exp -> Maybe Text
+cardinalRepr = render defaultRepr
+               { reprValue = \_ n -> M.lookup n syms
+               , reprAdd   = Just (⊞)
+               , reprMul   = Just (⊡)
+               }
+    where
+      (Lit 5 ⊞ _) _ = "-"
+      (_     ⊞ _) _ = " ak "
+
+      (_ ⊡ Lit 10) _ = "-"
+      (_ ⊡ _     ) _ = " "
+
+      syms =
+          M.fromList
+          [ (0, const "tus")
+          , (1, i "benn")
+          , (2, i "ñaar")
+          , (3, i "ñett")
+          , (4, i "ñeent")
+          , (5, i "juróom")
+          , (10, i "fukk")
+          , (100, i "téeméer")
+          , (1000, const "junni")
+          , (dec 6, const "tamndareet")
+          ]
+
+      i s = \c -> s <> case c of
+                         CtxMul _ (Lit n) _ | n >= 100 -> "i"
+                         CtxAdd R _ (CtxMul _ (Lit n) _) | n >= 100 -> "i"
+                         _ -> ""
diff --git a/src/Text/Numeral/Language/YOR.hs b/src/Text/Numeral/Language/YOR.hs
--- a/src/Text/Numeral/Language/YOR.hs
+++ b/src/Text/Numeral/Language/YOR.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
 {-|
 [@ISO639-1@]        yo
 
@@ -31,17 +26,10 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( ($), const, fix )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Prelude       ( Integral )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
+import "base" Data.Function ( fix )
+import "base" Data.Monoid ( (<>) )
 import qualified "containers" Data.Map as M ( fromList, lookup )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
+import "this" Text.Numeral
 import "this" Text.Numeral.Entry
 import "text" Data.Text ( Text )
 
@@ -63,7 +51,7 @@
 525 = (200*3) - (20*4) + 5
 -}
 
-entry ∷ Entry
+entry :: Entry
 entry = emptyEntry
     { entIso639_1    = Just "yo"
     , entIso639_2    = ["yor"]
@@ -76,13 +64,13 @@
                        }
     }
 
-cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-cardinal inf = cardinalRepr inf ∘ struct
+cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+cardinal inf = cardinalRepr inf . struct
 
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Sub β, E.Mul β) ⇒ α → β
+struct :: (Integral a) => a -> Exp
 struct = checkPos
        $ fix
-       $ conditional (≡ -5) lit
+       $ conditional (== -5) lit
        $ findRule (   1, lit        )
                 [ (  11, add 10  L  )
                 , (  15, add 20  L  )
@@ -115,19 +103,19 @@
                 ]
                    1000
 
-bounds ∷ (Integral α) ⇒ (α, α)
+bounds :: (Integral a) => (a, a)
 bounds = (1, 1000)
 
-cardinalRepr ∷ i → Exp i → Maybe Text
+cardinalRepr :: Inflection -> Exp -> Maybe Text
 cardinalRepr = render defaultRepr
-               { reprValue = \_ n → M.lookup n syms
+               { reprValue = \_ n -> M.lookup n syms
                , reprAdd   = Just (⊞)
                , reprMul   = Just (⊡)
-               , reprSub   = Just $ \_ _ _ → "dil"
+               , reprSub   = Just $ \_ _ _ -> "dil"
                }
     where
       (_     ⊞ Lit 10) _         = ""
-      (Lit n ⊞ _) _  | n ≡ -5    = ""
+      (Lit n ⊞ _) _  | n == -5   = ""
                      | otherwise = "lel"
       (_     ⊞ _) _              = ""
 
@@ -137,26 +125,26 @@
       syms =
           M.fromList
           [ (-5, const "med")
-          , ( 1, \c → case c of
-                        CtxAdd {} → "mokan"
-                        CtxSub {} → "mokan"
-                        _         → "ikan"
+          , ( 1, \c -> case c of
+                        CtxAdd {} -> "mokan"
+                        CtxSub {} -> "mokan"
+                        _         -> "ikan"
             )
           , ( 2, twentyForm "me" "go" "ji")
           , ( 3, twentyForm "me" "go" "ta")
           , ( 4, twentyForm "me" "go" "rin")
           , ( 5, twentyForm "ma" "go" "run")
-          , ( 6, const    $ "me"  ⊕   "fa")
-          , ( 7, const    $ "me"  ⊕   "je")
-          , ( 8, const    $ "me"  ⊕   "jo")
-          , ( 9, const    $ "me"  ⊕   "san")
-          , (10, \c → case c of
-                        CtxAdd {} → "la"
-                        _         → "mewa"
+          , ( 6, const    $ "me"  <>  "fa")
+          , ( 7, const    $ "me"  <>  "je")
+          , ( 8, const    $ "me"  <>  "jo")
+          , ( 9, const    $ "me"  <>  "san")
+          , (10, \c -> case c of
+                        CtxAdd {} -> "la"
+                        _         -> "mewa"
             )
-          , (20, \c → case c of
-                        CtxMul {} → "o"
-                        _         → "ogun"
+          , (20, \c -> case c of
+                        CtxMul {} -> "o"
+                        _         -> "ogun"
             )
           , (30, const "ogbon")
           , (50, const "adota")
@@ -165,7 +153,7 @@
           , (1000, const "egberun")
           ]
 
-      twentyForm c m s = \ctx → case ctx of
-                                  CtxMul _ (Lit 20) _ → m
-                                  _                   → c
-                                ⊕ s
+      twentyForm c m s = \ctx -> case ctx of
+                                   CtxMul _ (Lit 20) _ -> m
+                                   _                   -> c
+                                 <> s
diff --git a/src/Text/Numeral/Language/ZH.hs b/src/Text/Numeral/Language/ZH.hs
deleted file mode 100644
--- a/src/Text/Numeral/Language/ZH.hs
+++ /dev/null
@@ -1,352 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE PackageImports    #-}
-{-# LANGUAGE UnicodeSyntax     #-}
-
-{-|
-[@ISO639-1@]        zh
-
-[@ISO639-2B@]       chi
-
-[@ISO639-2T@]       zho
-
-[@ISO639-3@]        cmn
-
-[@Native name@]     官話
-
-[@English name@]    Chinese
--}
-
-module Text.Numeral.Language.ZH
-    ( -- * Language entries
-      trad_entry
-    , simpl_entry
-    , finance_trad_entry
-    , finance_simpl_entry
-    , pinyin_entry
-      -- * Conversions
-    , trad_cardinal
-    , simpl_cardinal
-    , finance_trad_cardinal
-    , finance_simpl_cardinal
-    , pinyin_cardinal
-      -- * Structure
-    , struct
-      -- * Bounds
-    , bounds
-    ) where
-
-
---------------------------------------------------------------------------------
--- Imports
---------------------------------------------------------------------------------
-
-import "base" Data.Bool     ( otherwise )
-import "base" Data.Function ( id, const, fix, flip, ($) )
-import "base" Data.Maybe    ( Maybe(Just) )
-import "base" Data.Ord      ( (<) )
-import "base" Prelude       ( Num, Integral, fromIntegral, (-), div, divMod, negate )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Data.Monoid.Unicode   ( (⊕) )
-import "base-unicode-symbols" Data.Ord.Unicode      ( (≥) )
-import qualified "containers" Data.Map as M ( Map, fromList, lookup )
-import "containers-unicode-symbols" Data.Map.Unicode ( (∪) )
-import           "this" Text.Numeral
-import qualified "this" Text.Numeral.Exp as E
-import           "this" Text.Numeral.Grammar ( Inflection )
-import           "this" Text.Numeral.Misc ( dec )
-import "this" Text.Numeral.Entry
-import "text" Data.Text ( Text )
-
-
---------------------------------------------------------------------------------
--- ZH
---------------------------------------------------------------------------------
-
-entry ∷ Entry
-entry = emptyEntry
-    { entIso639_1    = Just "zh"
-    , entIso639_2    = ["chi", "zho"]
-    , entIso639_3    = Just "cmn"
-    , entNativeNames = ["官話"]
-    , entEnglishName = Just "Chinese"
-    }
-
-flipIfR ∷ Side → (α → α → α) → (α → α → α)
-flipIfR L = id
-flipIfR R = flip
-
-add0 ∷ (Integral α, E.Lit β, E.Add β) ⇒ α → Rule α β
-add0 val f n | n < val `div` 10 = E.lit 0 `E.add` f n
-             | otherwise        = f n
-
-mulX ∷ (Integral α, E.Lit β, E.Add β, E.Mul β)
-     ⇒ α → Side → Side → Rule α β
-mulX val aSide mSide =
-    \f n → let (m, a) = n `divMod` val
-               mval = if m ≡ 1
-                      then E.lit 1 ⊡ E.lit (fromIntegral val)
-                      else f m ⊡ E.lit (fromIntegral val)
-           in if a ≡ 0
-              then mval
-              else (flipIfR aSide E.add) (add0 val f a) mval
-  where
-     (⊡) = flipIfR mSide E.mul
-
-struct ∷ (Integral α, E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β) ⇒ α → β
-struct = pos
-       $ fix
-       $ findRule (0, lit)
-                  ( [(dec 1, step  (dec 1) (dec 1) R L)]
-                  ⊕ [(dec n, stepX (dec n) (dec 1) R L) | n ← [2,3]]
-                  ⊕ [(dec n, stepX (dec n) (dec 4) R L) | n ← [4,8..44]]
-                  )
-                  (dec 48 - 1)
-    where
-      stepX = mkStep lit1 addX mulX
-
-      addX val _ = \f n → E.add (f val) (add0 val f $ n - val)
-
-bounds ∷ (Integral α) ⇒ (α, α)
-bounds = let x = dec 48 - 1 in (negate x, x)
-
-cardinalRepr ∷ Repr i
-cardinalRepr = defaultRepr
-               { reprAdd = Just $ \_ _ _ → ""
-               , reprMul = Just $ \_ _ _ → ""
-               }
-
-
---------------------------------------------------------------------------------
--- Traditional Characters
---------------------------------------------------------------------------------
-
-trad_entry ∷ Entry
-trad_entry = entry
-    { entVariant  = Just "traditional"
-    , entCardinal = Just Conversion
-                    { toNumeral   = trad_cardinal
-                    , toStructure = struct
-                    }
-    }
-
-trad_cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-trad_cardinal inf = trad_cardinalRepr inf ∘ struct
-
-trad_cardinalRepr ∷ i → Exp i → Maybe Text
-trad_cardinalRepr =
-    render cardinalRepr
-           { reprValue = \_ n → M.lookup n trad_syms
-           , reprNeg = Just $ \_ _ → "負"
-           }
-
-trad_syms ∷ (Integral α) ⇒ M.Map α (Ctx (Exp i) → Text)
-trad_syms =
-    M.fromList
-    [ (0, \c → case c of
-                 CtxEmpty → "零"
-                 _        → "〇"
-      )
-    , (1, const "一")
-    , (2, \c → case c of
-                 CtxMul _ (Lit n) _ | n ≥ 1000 → "兩"
-                 _ → "二"
-      )
-    , (3, const "三")
-    , (4, const "四")
-    , (5, const "五")
-    , (6, const "六")
-    , (7, const "七")
-    , (8, const "八")
-    , (9, const "九")
-    , (10, const "十")
-    , (100, const "百")
-    , (1000, const "千")
-    , (dec 4, const "萬")
-    , (dec 8, const "億")
-    , (dec 12, const "兆")
-    , (dec 16, const "京")
-    , (dec 20, const "垓")
-    , (dec 24, const "秭")
-    , (dec 28, const "穰")
-    , (dec 32, const "溝")
-    , (dec 36, const "澗")
-    , (dec 40, const "正")
-    , (dec 44, const "載")
-    ]
-
-
---------------------------------------------------------------------------------
--- Simplified Characters
---------------------------------------------------------------------------------
-
-simpl_entry ∷ Entry
-simpl_entry = entry
-    { entVariant  = Just "simplified"
-    , entCardinal = Just Conversion
-                    { toNumeral   = simpl_cardinal
-                    , toStructure = struct
-                    }
-    }
-
-simpl_cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-simpl_cardinal inf = simpl_cardinalRepr inf ∘ struct
-
-simpl_cardinalRepr ∷ i → Exp i → Maybe Text
-simpl_cardinalRepr =
-    render cardinalRepr
-           { reprValue = \_ n → M.lookup n (simpl_syms ∪ trad_syms)
-           , reprNeg = Just $ \_ _ → "负"
-           }
-
-simpl_syms ∷ (Integral α) ⇒ M.Map α (Ctx (Exp i) → Text)
-simpl_syms =
-    M.fromList
-    [ (2, \c → case c of
-                 CtxMul _ (Lit n) _ | n ≥ 1000 → "两"
-                 _ → "二"
-      )
-    , (dec 4, const "万")
-    , (dec 8, const "亿")
-    ]
-
-
---------------------------------------------------------------------------------
--- Financial Characters (Traditional)
---------------------------------------------------------------------------------
-
-finance_trad_entry ∷ Entry
-finance_trad_entry = entry
-    { entVariant  = Just "finance traditional"
-    , entCardinal = Just Conversion
-                    { toNumeral   = finance_trad_cardinal
-                    , toStructure = struct
-                    }
-    }
-
-finance_trad_cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-finance_trad_cardinal inf = finance_trad_cardinalRepr inf ∘ struct
-
-finance_trad_cardinalRepr ∷ i → Exp i → Maybe Text
-finance_trad_cardinalRepr =
-    render cardinalRepr
-           { reprValue = \_ n → M.lookup n (finance_trad_syms ∪ trad_syms)
-           , reprNeg = Just $ \_ _ → "負"
-           }
-
-finance_trad_syms ∷ (Integral α) ⇒ M.Map α (Ctx (Exp i) → Text)
-finance_trad_syms =
-    M.fromList
-    [ (0, const "零")
-    , (1, const "壹")
-    , (2, const "貳")
-    , (3, const "参")
-    , (4, const "肆")
-    , (5, const "伍")
-    , (6, const "陸")
-    , (7, const "柒")
-    , (8, const "捌")
-    , (9, const "玖")
-    , (10, const "拾")
-    , (100, const "伯")
-    , (1000, const "仟")
-    , (dec 4, const "萬")
-    , (dec 8, const "億")
-    ]
-
-
---------------------------------------------------------------------------------
--- Financial Characters (Simplified)
---------------------------------------------------------------------------------
-
-finance_simpl_entry ∷ Entry
-finance_simpl_entry = entry
-    { entVariant  = Just "finance simplified"
-    , entCardinal = Just Conversion
-                    { toNumeral   = finance_simpl_cardinal
-                    , toStructure = struct
-                    }
-    }
-
-finance_simpl_cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-finance_simpl_cardinal inf = finance_simpl_cardinalRepr inf ∘ struct
-
-finance_simpl_cardinalRepr ∷ i → Exp i → Maybe Text
-finance_simpl_cardinalRepr =
-    render cardinalRepr
-           { reprValue = \_ n → M.lookup n ( finance_simpl_syms
-                                           ∪ finance_trad_syms
-                                           ∪ trad_syms
-                                           )
-           , reprNeg = Just $ \_ _ → "负"
-           }
-  where
-    finance_simpl_syms ∷ (Integral α) ⇒ M.Map α (Ctx (Exp i) → Text)
-    finance_simpl_syms =
-        M.fromList
-        [ (2, const "贰")
-        , (6, const "陆")
-        , (dec 4, const "万")
-        , (dec 8, const "亿")
-        ]
-
-
---------------------------------------------------------------------------------
--- Pinyin
---------------------------------------------------------------------------------
-
-pinyin_entry ∷ Entry
-pinyin_entry = entry
-    { entVariant  = Just "pinyin"
-    , entCardinal = Just Conversion
-                    { toNumeral   = pinyin_cardinal
-                    , toStructure = struct
-                    }
-    }
-
-pinyin_cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
-pinyin_cardinal inf = pinyin_cardinalRepr inf ∘ struct
-
-pinyin_cardinalRepr ∷ i → Exp i → Maybe Text
-pinyin_cardinalRepr =
-    render cardinalRepr
-           { reprValue = \_ n → M.lookup n pinyin_syms
-           , reprNeg = Just $ \_ _ → "fù"
-           , reprAdd = Just (⊞)
-           }
-  where
-    (Lit 10 ⊞ _) _ = ""
-    (_      ⊞ _) _ = " "
-
-    pinyin_syms ∷ (Integral α) ⇒ M.Map α (Ctx (Exp i) → Text)
-    pinyin_syms =
-        M.fromList
-        [ (0, const "líng")
-        , (1, const "yī")
-        , (2, \c → case c of
-                     CtxMul _ (Lit n) _ | n ≥ 1000 → "liǎng"
-                     _ → "èr"
-          )
-        , (3, const "sān")
-        , (4, const "sì")
-        , (5, const "wǔ")
-        , (6, const "liù")
-        , (7, const "qī")
-        , (8, const "bā")
-        , (9, const "jiǔ")
-        , (10, const "shí")
-        , (100, const "bǎi")
-        , (1000, const "qiān")
-        , (dec 4, const "wàn")
-        , (dec 8, const "yì")
-        , (dec 12, const "zhào")
-        , (dec 16, const "jīng")
-        , (dec 20, const "gāi")
-        , (dec 24, const "zǐ")
-        , (dec 28, const "ráng")
-        , (dec 32, const "gōu")
-        , (dec 36, const "jiàn")
-        , (dec 40, const "zhēng")
-        , (dec 44, const "zài")
-        ]
diff --git a/src/Text/Numeral/Language/ZHO.hs b/src/Text/Numeral/Language/ZHO.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Numeral/Language/ZHO.hs
@@ -0,0 +1,336 @@
+{-|
+[@ISO639-1@]        zh
+
+[@ISO639-2B@]       chi
+
+[@ISO639-2T@]       zho
+
+[@ISO639-3@]        cmn
+
+[@Native name@]     官話
+
+[@English name@]    Chinese
+-}
+
+module Text.Numeral.Language.ZHO
+    ( -- * Language entries
+      trad_entry
+    , simpl_entry
+    , finance_trad_entry
+    , finance_simpl_entry
+    , pinyin_entry
+      -- * Conversions
+    , trad_cardinal
+    , simpl_cardinal
+    , finance_trad_cardinal
+    , finance_simpl_cardinal
+    , pinyin_cardinal
+      -- * Structure
+    , struct
+      -- * Bounds
+    , bounds
+    ) where
+
+
+--------------------------------------------------------------------------------
+-- Imports
+--------------------------------------------------------------------------------
+
+import "base" Data.Function ( fix )
+import "base" Data.Monoid ( (<>) )
+import qualified "containers" Data.Map as M
+import "this" Text.Numeral
+import "this" Text.Numeral.Misc ( dec )
+import "this" Text.Numeral.Entry
+import "text" Data.Text ( Text )
+
+
+--------------------------------------------------------------------------------
+-- ZHO
+--------------------------------------------------------------------------------
+
+entry :: Entry
+entry = emptyEntry
+    { entIso639_1    = Just "zh"
+    , entIso639_2    = ["chi", "zho"]
+    , entIso639_3    = Just "cmn"
+    , entNativeNames = ["官話"]
+    , entEnglishName = Just "Chinese"
+    }
+
+flipIfR :: Side -> (a -> a -> a) -> (a -> a -> a)
+flipIfR L = id
+flipIfR R = flip
+
+add0 :: (Integral a) => a -> Rule a
+add0 val f n | n < val `div` 10 = Lit 0 `Add` f n
+             | otherwise        = f n
+
+mulX :: (Integral a) => a -> Side -> Side -> Rule a
+mulX val aSide mSide =
+    \f n -> let (m, a) = n `divMod` val
+                mval = if m == 1
+                       then Lit 1 ⊡ Lit (fromIntegral val)
+                       else f m ⊡ Lit (fromIntegral val)
+           in if a == 0
+              then mval
+              else (flipIfR aSide Add) (add0 val f a) mval
+  where
+     (⊡) = flipIfR mSide Mul
+
+struct :: (Integral a) => a -> Exp
+struct = pos
+       $ fix
+       $ findRule (0, lit)
+                  (  [(dec 1, step  (dec 1) (dec 1) R L)]
+                  <> [(dec n, stepX (dec n) (dec 1) R L) | n <- [2,3]]
+                  <> [(dec n, stepX (dec n) (dec 4) R L) | n <- [4,8..44]]
+                  )
+                  (dec 48 - 1)
+    where
+      stepX = mkStep lit1 addX mulX
+
+      addX val _ = \f n -> Add (f val) (add0 val f $ n - val)
+
+bounds :: (Integral a) => (a, a)
+bounds = let x = dec 48 - 1 in (negate x, x)
+
+cardinalRepr :: Repr
+cardinalRepr = defaultRepr
+               { reprAdd = Just $ \_ _ _ -> ""
+               , reprMul = Just $ \_ _ _ -> ""
+               }
+
+
+--------------------------------------------------------------------------------
+-- Traditional Characters
+--------------------------------------------------------------------------------
+
+trad_entry :: Entry
+trad_entry = entry
+    { entVariant  = Just "traditional"
+    , entCardinal = Just Conversion
+                    { toNumeral   = trad_cardinal
+                    , toStructure = struct
+                    }
+    }
+
+trad_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+trad_cardinal inf = trad_cardinalRepr inf . struct
+
+trad_cardinalRepr :: Inflection -> Exp -> Maybe Text
+trad_cardinalRepr =
+    render cardinalRepr
+           { reprValue = \_ n -> M.lookup n trad_syms
+           , reprNeg = Just $ \_ _ -> "負"
+           }
+
+trad_syms :: (Integral a) => M.Map a (Ctx Exp -> Text)
+trad_syms =
+    M.fromList
+    [ (0, \c -> case c of
+                 CtxEmpty -> "零"
+                 _        -> "〇"
+      )
+    , (1, const "一")
+    , (2, \c -> case c of
+                 CtxMul _ (Lit n) _ | n >= 1000 -> "兩"
+                 _ -> "二"
+      )
+    , (3, const "三")
+    , (4, const "四")
+    , (5, const "五")
+    , (6, const "六")
+    , (7, const "七")
+    , (8, const "八")
+    , (9, const "九")
+    , (10, const "十")
+    , (100, const "百")
+    , (1000, const "千")
+    , (dec 4, const "萬")
+    , (dec 8, const "億")
+    , (dec 12, const "兆")
+    , (dec 16, const "京")
+    , (dec 20, const "垓")
+    , (dec 24, const "秭")
+    , (dec 28, const "穰")
+    , (dec 32, const "溝")
+    , (dec 36, const "澗")
+    , (dec 40, const "正")
+    , (dec 44, const "載")
+    ]
+
+
+--------------------------------------------------------------------------------
+-- Simplified Characters
+--------------------------------------------------------------------------------
+
+simpl_entry :: Entry
+simpl_entry = entry
+    { entVariant  = Just "simplified"
+    , entCardinal = Just Conversion
+                    { toNumeral   = simpl_cardinal
+                    , toStructure = struct
+                    }
+    }
+
+simpl_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+simpl_cardinal inf = simpl_cardinalRepr inf . struct
+
+simpl_cardinalRepr :: Inflection -> Exp -> Maybe Text
+simpl_cardinalRepr =
+    render cardinalRepr
+           { reprValue = \_ n -> M.lookup n (simpl_syms `M.union` trad_syms)
+           , reprNeg = Just $ \_ _ -> "负"
+           }
+
+simpl_syms :: (Integral a) => M.Map a (Ctx Exp -> Text)
+simpl_syms =
+    M.fromList
+    [ (2, \c -> case c of
+                 CtxMul _ (Lit n) _ | n >= 1000 -> "两"
+                 _ -> "二"
+      )
+    , (dec 4, const "万")
+    , (dec 8, const "亿")
+    ]
+
+
+--------------------------------------------------------------------------------
+-- Financial Characters (Traditional)
+--------------------------------------------------------------------------------
+
+finance_trad_entry :: Entry
+finance_trad_entry = entry
+    { entVariant  = Just "finance traditional"
+    , entCardinal = Just Conversion
+                    { toNumeral   = finance_trad_cardinal
+                    , toStructure = struct
+                    }
+    }
+
+finance_trad_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+finance_trad_cardinal inf = finance_trad_cardinalRepr inf . struct
+
+finance_trad_cardinalRepr :: Inflection -> Exp -> Maybe Text
+finance_trad_cardinalRepr =
+    render cardinalRepr
+           { reprValue = \_ n -> M.lookup n (finance_trad_syms `M.union` trad_syms)
+           , reprNeg = Just $ \_ _ -> "負"
+           }
+
+finance_trad_syms :: (Integral a) => M.Map a (Ctx Exp -> Text)
+finance_trad_syms =
+    M.fromList
+    [ (0, const "零")
+    , (1, const "壹")
+    , (2, const "貳")
+    , (3, const "参")
+    , (4, const "肆")
+    , (5, const "伍")
+    , (6, const "陸")
+    , (7, const "柒")
+    , (8, const "捌")
+    , (9, const "玖")
+    , (10, const "拾")
+    , (100, const "伯")
+    , (1000, const "仟")
+    , (dec 4, const "萬")
+    , (dec 8, const "億")
+    ]
+
+
+--------------------------------------------------------------------------------
+-- Financial Characters (Simplified)
+--------------------------------------------------------------------------------
+
+finance_simpl_entry :: Entry
+finance_simpl_entry = entry
+    { entVariant  = Just "finance simplified"
+    , entCardinal = Just Conversion
+                    { toNumeral   = finance_simpl_cardinal
+                    , toStructure = struct
+                    }
+    }
+
+finance_simpl_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+finance_simpl_cardinal inf = finance_simpl_cardinalRepr inf . struct
+
+finance_simpl_cardinalRepr :: Inflection -> Exp -> Maybe Text
+finance_simpl_cardinalRepr =
+    render cardinalRepr
+           { reprValue = \_ n -> M.lookup n ( finance_simpl_syms
+                                            `M.union` finance_trad_syms
+                                            `M.union` trad_syms
+                                            )
+           , reprNeg = Just $ \_ _ -> "负"
+           }
+  where
+    finance_simpl_syms :: (Integral a) => M.Map a (Ctx Exp -> Text)
+    finance_simpl_syms =
+        M.fromList
+        [ (2, const "贰")
+        , (6, const "陆")
+        , (dec 4, const "万")
+        , (dec 8, const "亿")
+        ]
+
+
+--------------------------------------------------------------------------------
+-- Pinyin
+--------------------------------------------------------------------------------
+
+pinyin_entry :: Entry
+pinyin_entry = entry
+    { entVariant  = Just "pinyin"
+    , entCardinal = Just Conversion
+                    { toNumeral   = pinyin_cardinal
+                    , toStructure = struct
+                    }
+    }
+
+pinyin_cardinal :: (Integral a) => Inflection -> a -> Maybe Text
+pinyin_cardinal inf = pinyin_cardinalRepr inf . struct
+
+pinyin_cardinalRepr :: Inflection -> Exp -> Maybe Text
+pinyin_cardinalRepr =
+    render cardinalRepr
+           { reprValue = \_ n -> M.lookup n pinyin_syms
+           , reprNeg = Just $ \_ _ -> "fù"
+           , reprAdd = Just (⊞)
+           }
+  where
+    (Lit 10 ⊞ _) _ = ""
+    (_      ⊞ _) _ = " "
+
+    pinyin_syms :: (Integral a) => M.Map a (Ctx Exp -> Text)
+    pinyin_syms =
+        M.fromList
+        [ (0, const "líng")
+        , (1, const "yī")
+        , (2, \c -> case c of
+                     CtxMul _ (Lit n) _ | n >= 1000 -> "liǎng"
+                     _ -> "èr"
+          )
+        , (3, const "sān")
+        , (4, const "sì")
+        , (5, const "wǔ")
+        , (6, const "liù")
+        , (7, const "qī")
+        , (8, const "bā")
+        , (9, const "jiǔ")
+        , (10, const "shí")
+        , (100, const "bǎi")
+        , (1000, const "qiān")
+        , (dec 4, const "wàn")
+        , (dec 8, const "yì")
+        , (dec 12, const "zhào")
+        , (dec 16, const "jīng")
+        , (dec 20, const "gāi")
+        , (dec 24, const "zǐ")
+        , (dec 28, const "ráng")
+        , (dec 32, const "gōu")
+        , (dec 36, const "jiàn")
+        , (dec 40, const "zhēng")
+        , (dec 44, const "zài")
+        ]
diff --git a/src/Text/Numeral/Misc.hs b/src/Text/Numeral/Misc.hs
--- a/src/Text/Numeral/Misc.hs
+++ b/src/Text/Numeral/Misc.hs
@@ -1,49 +1,21 @@
-{-# LANGUAGE CPP
-           , MagicHash
-           , NoImplicitPrelude
-           , PackageImports
-           , UnicodeSyntax
-  #-}
-
 module Text.Numeral.Misc where
 
 --------------------------------------------------------------------------------
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base" Prelude ( Integral, (^) )
-#if __GLASGOW_HASKELL__ >= 702
-import "base" Data.Function ( ($) )
-import "base" GHC.Exts      ( Int(I#) )
-import "base" Prelude       ( fromIntegral, toInteger )
-import "integer-gmp" GHC.Integer.Logarithms ( integerLogBase# )
-#else
-import "base" Data.Bool ( otherwise )
-import "base" Data.Ord  ( (<) )
-import "base" Prelude   ( div, (+), ($!), error )
-#endif
+import "this" Math.NumberTheory.Logarithms ( integerLog10' )
 
 --------------------------------------------------------------------------------
 -- Misc
 --------------------------------------------------------------------------------
 
 -- ^ Raise 10 to some power.
-dec ∷ (Integral α) ⇒ α → α
+dec :: (Integral a) => a -> a
 dec = (10 ^)
 
 -- ^ The (base 10) logarithm of an integral value. Note that the
 -- result must be able to fit in an ordinary Int value. This means the
--- maximum input value is 10 ^ (maxBound ∷ Int).
-intLog ∷ (Integral α) ⇒ α → α
--- GHC >= 7.2.x
-#if __GLASGOW_HASKELL__ >= 702
-intLog x = fromIntegral $ I# (integerLogBase# 10 (toInteger x))
-#else
-intLog x | x < 0 = error "intLog: undefined for negative numbers"
-         | otherwise = go x 0
-    where
-      go n acc = case n `div` 10 of
-                   0 → acc
-                   1 → acc + 1
-                   q → go q $! acc + 1
-#endif
+-- maximum input value is 10 ^ (maxBound :: Int).
+intLog :: (Integral a) => a -> a
+intLog = fromIntegral . integerLog10' . toInteger
diff --git a/src/Text/Numeral/Render.hs b/src/Text/Numeral/Render.hs
--- a/src/Text/Numeral/Render.hs
+++ b/src/Text/Numeral/Render.hs
@@ -1,8 +1,4 @@
-{-# LANGUAGE NoImplicitPrelude
-           , UnicodeSyntax
-           , PackageImports
-           , RecordWildCards
-  #-}
+{-# LANGUAGE RecordWildCards #-}
 
 module Text.Numeral.Render
     ( -- * Rendering numerals
@@ -15,27 +11,17 @@
     , Ctx(..)
     , posIndex
     , isOutside
-    )
-    where
+    ) where
 
 
 -------------------------------------------------------------------------------
 -- Imports
 -------------------------------------------------------------------------------
 
-import "base" Data.Bool     ( Bool(False, True), otherwise )
-import "base" Data.Eq       ( Eq )
-import "base" Data.Function ( ($) )
-import "base" Data.Functor  ( (<$>) )
-import "base" Data.Maybe    ( Maybe(Nothing, Just) )
-import "base" Prelude       ( (+) )
-import "base" Text.Show     ( Show )
-import "base-unicode-symbols" Data.Eq.Unicode     ( (≡) )
-import "base-unicode-symbols" Data.Monoid.Unicode ( (⊕) )
-import "base-unicode-symbols" Prelude.Unicode     ( ℤ )
-import "text"                 Data.Text ( Text )
-import "this"                 Text.Numeral.Exp.Reified ( Exp(..), Side(L, R) )
-
+import "base" Data.Monoid ( (<>) )
+import "text" Data.Text ( Text )
+import "this" Text.Numeral.Exp ( Exp(..), Side(L, R) )
+import "this" Text.Numeral.Grammar ( Inflection(..) )
 
 -------------------------------------------------------------------------------
 -- Rendering numerals
@@ -43,42 +29,42 @@
 
 -- | Renders an expression to a 'Text' value according to a certain
 -- representation and inflection.
-render ∷ Repr i -- ^ Representation.
-       → i      -- ^ Initial inflection.
-       → Exp i  -- ^ The expression to render.
-       → Maybe Text
+render :: Repr -- ^ Representation.
+       -> Inflection -- ^ Initial inflection.
+       -> Exp -- ^ The expression to render.
+       -> Maybe Text
 render (Repr {..}) = go CtxEmpty
     where
       go _   _   Unknown = reprUnknown
       go ctx inf (Lit n) = ($ ctx) <$> reprValue inf n
-      go ctx inf (Neg x) = do x' ← go (CtxNeg ctx) inf x
-                              rn ← reprNeg
-                              rnc ← reprNegCombine
+      go ctx inf (Neg x) = do x' <- go (CtxNeg ctx) inf x
+                              rn <- reprNeg
+                              rnc <- reprNegCombine
                               Just $ rnc (rn x ctx) x' x
-      go ctx inf (Add x y) = do x' ← go (CtxAdd L y ctx) inf x
-                                y' ← go (CtxAdd R x ctx) inf y
-                                ra ← reprAdd
-                                rac ← reprAddCombine
+      go ctx inf (Add x y) = do x' <- go (CtxAdd L y ctx) inf x
+                                y' <- go (CtxAdd R x ctx) inf y
+                                ra <- reprAdd
+                                rac <- reprAddCombine
                                 Just $ rac (ra x y ctx) x' x y' y
-      go ctx inf (Mul x y) = do x' ← go (CtxMul L y ctx) inf x
-                                y' ← go (CtxMul R x ctx) inf y
-                                rm ← reprMul
-                                rmc ← reprMulCombine
+      go ctx inf (Mul x y) = do x' <- go (CtxMul L y ctx) inf x
+                                y' <- go (CtxMul R x ctx) inf y
+                                rm <- reprMul
+                                rmc <- reprMulCombine
                                 Just $ rmc (rm x y ctx) x' x y' y
-      go ctx inf (Sub x y) = do x' ← go (CtxSub L y ctx) inf x
-                                y' ← go (CtxSub R x ctx) inf y
-                                rs ← reprSub
-                                rsc ← reprSubCombine
+      go ctx inf (Sub x y) = do x' <- go (CtxSub L y ctx) inf x
+                                y' <- go (CtxSub R x ctx) inf y
+                                rs <- reprSub
+                                rsc <- reprSubCombine
                                 Just $ rsc (rs x y ctx) x' x y' y
-      go ctx inf (Frac x y) = do x' ← go (CtxFrac L y ctx) inf x
-                                 y' ← go (CtxFrac R x ctx) inf y
-                                 rf ← reprFrac
-                                 rfc ← reprFracCombine
+      go ctx inf (Frac x y) = do x' <- go (CtxFrac L y ctx) inf x
+                                 y' <- go (CtxFrac R x ctx) inf y
+                                 rf <- reprFrac
+                                 rfc <- reprFracCombine
                                  Just $ rfc (rf x y ctx) x' x y' y
       go ctx inf (Scale b o r) = reprScale inf b o r ctx
-      go ctx inf (Dual   x) = go (CtxDual   ctx) inf x
-      go ctx inf (Plural x) = go (CtxPlural ctx) inf x
-      go ctx inf (Inflection f x) = go ctx (f inf) x
+      go ctx inf (ChangeCase   mbCase   x) = go ctx (inf {iCase   = mbCase  }) x
+      go ctx inf (ChangeGender mbGender x) = go ctx (inf {iGender = mbGender}) x
+      go ctx inf (ChangeNumber mbNumber x) = go ctx (inf {iNumber = mbNumber}) x
 
 
 --------------------------------------------------------------------------------
@@ -89,75 +75,75 @@
 --
 -- A 'Repr' contains all the information on how to render an
 -- 'Exp'ression to a 'Text' value.
-data Repr i =
+data Repr =
     Repr
     { -- | Representation for unknown values.
-      reprUnknown ∷ Maybe Text
+      reprUnknown :: Maybe Text
       -- | Renders a literal value. Not necessarily defined for every
       -- value.
-    , reprValue ∷ i → ℤ → Maybe (Ctx (Exp i) → Text)
+    , reprValue :: Inflection -> Integer -> Maybe (Ctx Exp -> Text)
       -- | Renders a negation. This concerns the negation itself, not
       -- the thing being negated.
-    , reprNeg ∷ Maybe (Exp i → Ctx (Exp i) → Text)
+    , reprNeg :: Maybe (Exp -> Ctx Exp -> Text)
       -- | Renders an addition. This concerns the addition itself, not
       -- the things being added. For example: In \"one hundred and
       -- eighty\" this function would be responsible for rendering the
       -- \"and\".
-    , reprAdd ∷ Maybe (Exp i → Exp i → Ctx (Exp i) → Text)
+    , reprAdd :: Maybe (Exp -> Exp -> Ctx Exp -> Text)
       -- | Renders a multiplication. This concerns the multiplication
       -- itself, not the things being multiplied.
-    , reprMul ∷ Maybe (Exp i → Exp i → Ctx (Exp i) → Text)
+    , reprMul :: Maybe (Exp -> Exp -> Ctx Exp -> Text)
       -- | Renders a subtraction. This concerns the subtraction
       -- itself, not the things being subtracted.
-    , reprSub ∷ Maybe (Exp i → Exp i → Ctx (Exp i) → Text)
+    , reprSub :: Maybe (Exp -> Exp -> Ctx Exp -> Text)
       -- | Renders a fraction. This concerns the fraction itself, not
       -- the numerator or the denominator.
-    , reprFrac ∷ Maybe (Exp i → Exp i → Ctx (Exp i) → Text)
+    , reprFrac :: Maybe (Exp -> Exp -> Ctx Exp -> Text)
       -- | Renders a step in a scale of large values.
-    , reprScale ∷ ScaleRepr i
+    , reprScale :: ScaleRepr
       -- | Combines a negation and the thing being negated. For
       -- example: this would combine \"minus\" and \"three\" into
       -- \"minus three\".
-    , reprNegCombine ∷ Maybe (Text → Text → Exp i → Text)
+    , reprNegCombine :: Maybe (Text -> Text -> Exp -> Text)
       -- | Combines an addition and the things being added.
-    , reprAddCombine ∷ Maybe (Text → Text → Exp i → Text → Exp i → Text)
+    , reprAddCombine :: Maybe (Text -> Text -> Exp -> Text -> Exp -> Text)
       -- | Combines a multiplication and the things being multiplied.
-    , reprMulCombine ∷ Maybe (Text → Text → Exp i → Text → Exp i → Text)
+    , reprMulCombine :: Maybe (Text -> Text -> Exp -> Text -> Exp -> Text)
       -- | Combines a subtraction and the things being subtracted.
-    , reprSubCombine ∷ Maybe (Text → Text → Exp i → Text → Exp i → Text)
+    , reprSubCombine :: Maybe (Text -> Text -> Exp -> Text -> Exp -> Text)
       -- | Combines a fraction and the numerator and denominator.
-    , reprFracCombine ∷ Maybe (Text → Text → Exp i → Text → Exp i → Text)
+    , reprFracCombine :: Maybe (Text -> Text -> Exp -> Text -> Exp -> Text)
     }
 
 -- | Function that renders the representation of a step in a scale of
 -- large values. The value represented by the step is 10 ^ (rank *
 -- base + offset).
-type ScaleRepr i = i
-                 → ℤ -- ^ Base.
-                 → ℤ -- ^ Offset.
-                 → Exp i -- ^ Rank.
-                 → Ctx (Exp i) -- ^ Rank context.
-                 → Maybe Text
+type ScaleRepr = Inflection
+               -> Integer -- ^ Base.
+               -> Integer -- ^ Offset.
+               -> Exp -- ^ Rank.
+               -> Ctx Exp -- ^ Rank context.
+               -> Maybe Text
 
 -- | The default representation.
 --
 -- Only the combining functions are defined. The rest are either
 -- 'Nothing' or always produce 'Nothing'.
-defaultRepr ∷ Repr inf
+defaultRepr :: Repr
 defaultRepr =
     Repr { reprUnknown = Nothing
-         , reprValue   = \_ _ → Nothing
+         , reprValue   = \_ _ -> Nothing
          , reprNeg     = Nothing
          , reprAdd     = Nothing
          , reprMul     = Nothing
          , reprSub     = Nothing
          , reprFrac    = Nothing
-         , reprScale   = \_ _ _ _ _ → Nothing
-         , reprNegCombine  = Just $ \n x _     → n ⊕ x
-         , reprAddCombine  = Just $ \a x _ y _ → x ⊕ a ⊕ y
-         , reprMulCombine  = Just $ \m x _ y _ → x ⊕ m ⊕ y
-         , reprSubCombine  = Just $ \s x _ y _ → x ⊕ s ⊕ y
-         , reprFracCombine = Just $ \f n _ d _ → n ⊕ f ⊕ d
+         , reprScale   = \_ _ _ _ _ -> Nothing
+         , reprNegCombine  = Just $ \n x _     -> n <> x
+         , reprAddCombine  = Just $ \a x _ y _ -> x <> a <> y
+         , reprMulCombine  = Just $ \m x _ y _ -> x <> m <> y
+         , reprSubCombine  = Just $ \s x _ y _ -> x <> s <> y
+         , reprFracCombine = Just $ \f n _ d _ -> n <> f <> d
          }
 
 
@@ -166,40 +152,34 @@
 --------------------------------------------------------------------------------
 
 -- | A context in which an 'Exp'ression appears.
-data Ctx α   -- | The empty context. Used for top level expressions.
-           = CtxEmpty
-             -- | Negation context.
-           | CtxNeg (Ctx α)
-             -- | Addition context.
-           | CtxAdd Side α (Ctx α)
-             -- | Multiplication context.
-           | CtxMul Side α (Ctx α)
-             -- | Subtraction context.
-           | CtxSub Side α (Ctx α)
-             -- | Fraction context.
-           | CtxFrac Side α (Ctx α)
-             -- | Scale context.
-           | CtxScale (Ctx α)
-             -- | Dual context.
-           | CtxDual (Ctx α)
-             -- | Plural context.
-           | CtxPlural (Ctx α)
-             deriving (Eq, Show)
-
+data Ctx a
+     -- | The empty context. Used for top level expressions.
+   = CtxEmpty
+     -- | Negation context.
+   | CtxNeg (Ctx a)
+     -- | Addition context.
+   | CtxAdd Side a (Ctx a)
+     -- | Multiplication context.
+   | CtxMul Side a (Ctx a)
+     -- | Subtraction context.
+   | CtxSub Side a (Ctx a)
+     -- | Fraction context.
+   | CtxFrac Side a (Ctx a)
+     -- | Scale context.
+   | CtxScale (Ctx a)
+     deriving (Eq, Show)
 
-posIndex ∷ Ctx α → ℤ
+posIndex :: Ctx a -> Integer
 posIndex c = go 0 c
     where
-      go ∷ ℤ → Ctx α → ℤ
+      go :: Integer -> Ctx a -> Integer
       go acc CtxEmpty = acc
       go acc (CtxNeg nc) = go acc nc
-      go acc (CtxAdd  as _ ac) = go (acc + if as ≡ L then -1 else 1) ac
-      go acc (CtxMul  ms _ mc) = go (acc + if ms ≡ L then -1 else 1) mc
-      go acc (CtxSub  ss _ sc) = go (acc + if ss ≡ L then -1 else 1) sc
-      go acc (CtxFrac fs _ fc) = go (acc + if fs ≡ L then -1 else 1) fc
+      go acc (CtxAdd  as _ ac) = go (acc + if as == L then -1 else 1) ac
+      go acc (CtxMul  ms _ mc) = go (acc + if ms == L then -1 else 1) mc
+      go acc (CtxSub  ss _ sc) = go (acc + if ss == L then -1 else 1) sc
+      go acc (CtxFrac fs _ fc) = go (acc + if fs == L then -1 else 1) fc
       go acc (CtxScale  sc) = go acc sc
-      go acc (CtxDual   dc) = go acc dc
-      go acc (CtxPlural pc) = go acc pc
 
 -- | Checks whether a context is completely on the outside of an
 -- expression, either left or right.
@@ -211,20 +191,18 @@
 -- @
 --
 -- On the left we have @'Lit' 1000@ and on the right @'Lit' 10@.
-isOutside ∷ Side → Ctx α → Bool
+isOutside :: Side -> Ctx a -> Bool
 isOutside s c = go c
     where
-      go ∷ Ctx α → Bool
+      go :: Ctx a -> Bool
       go CtxEmpty = True
       go (CtxNeg nc) = go nc
-      go (CtxAdd  as _ ac) | as ≡ s    = go ac
+      go (CtxAdd  as _ ac) | as == s   = go ac
                            | otherwise = False
-      go (CtxMul  ms _ mc) | ms ≡ s    = go mc
+      go (CtxMul  ms _ mc) | ms == s   = go mc
                            | otherwise = False
-      go (CtxSub  ss _ sc) | ss ≡ s    = go sc
+      go (CtxSub  ss _ sc) | ss == s   = go sc
                            | otherwise = False
-      go (CtxFrac fs _ fc) | fs ≡ s    = go fc
+      go (CtxFrac fs _ fc) | fs == s   = go fc
                            | otherwise = False
       go (CtxScale  sc) = go sc
-      go (CtxDual   dc) = go dc
-      go (CtxPlural pc) = go pc
diff --git a/src/Text/Numeral/Render/Utils.hs b/src/Text/Numeral/Render/Utils.hs
--- a/src/Text/Numeral/Render/Utils.hs
+++ b/src/Text/Numeral/Render/Utils.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude
-           , PackageImports
-           , UnicodeSyntax
-  #-}
-
 module Text.Numeral.Render.Utils
     ( addCtx
     , mulCtx
@@ -13,8 +8,6 @@
 -- Imports
 --------------------------------------------------------------------------------
 
-import "base-unicode-symbols" Data.Eq.Unicode ( (≡) )
-import "base-unicode-symbols" Prelude.Unicode ( ℤ )
 import "this" Text.Numeral
 
 
@@ -22,19 +15,19 @@
 -- Utility functions for rendering numerals
 --------------------------------------------------------------------------------
 
-addCtx ∷ ℤ → s → (Ctx (Exp i) → s) → Ctx (Exp i) → s
+addCtx :: Integer -> s -> (Ctx Exp -> s) -> Ctx Exp -> s
 addCtx val match other ctx =
     case ctx of
-      CtxAdd _ (Lit n) _ | val ≡ n → match
-      _ → other ctx
+      CtxAdd _ (Lit n) _ | val == n -> match
+      _ -> other ctx
 
-mulCtx ∷ ℤ → s → (Ctx (Exp i) → s) → Ctx (Exp i) → s
+mulCtx :: Integer -> s -> (Ctx Exp -> s) -> Ctx Exp -> s
 mulCtx val match other ctx =
     case ctx of
-      CtxMul _ (Lit n) _ | val ≡ n → match
-      _ → other ctx
+      CtxMul _ (Lit n) _ | val == n -> match
+      _ -> other ctx
 
-outsideCtx ∷ Side → s → (Ctx (Exp i) → s) → Ctx (Exp i) → s
+outsideCtx :: Side -> s -> (Ctx Exp -> s) -> Ctx Exp -> s
 outsideCtx side match other ctx =
     if isOutside side ctx
     then match
diff --git a/src/Text/Numeral/Rules.hs b/src/Text/Numeral/Rules.hs
--- a/src/Text/Numeral/Rules.hs
+++ b/src/Text/Numeral/Rules.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE NoImplicitPrelude
-           , PackageImports
-           , UnicodeSyntax
-  #-}
-
 {-|
 
 Rules to convert numbers to an expression language.
@@ -24,8 +19,6 @@
   , lit, lit1
 
   , pos, checkPos
-  , dual, plural
-  , inflection
 
   , add
   , mul, mul1
@@ -36,6 +29,11 @@
   , shortScale1, longScale1, pelletierScale1
 
   , mkStep, step, step1
+
+    -- ** Grammar Rules
+  , changeCase
+  , changeGender
+  , changeNumber
   ) where
 
 
@@ -43,19 +41,11 @@
 -- Imports
 -------------------------------------------------------------------------------
 
-import "base" Data.Bool           ( Bool, otherwise )
-import "base" Data.Function       ( ($), id, const, flip, fix )
-import "base" Data.List           ( foldr )
-import "base" Data.Ord            ( Ord, (<), (>) )
-import "base" Prelude             ( Integral, fromIntegral
-                                  , Num, (-), abs, divMod, div, even
-                                  )
-import "base-unicode-symbols" Data.Eq.Unicode       ( (≡) )
-import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
-import "base-unicode-symbols" Prelude.Unicode       ( (⋅) )
-import "this"                 Text.Numeral.Exp.Reified ( Side(L, R) )
-import "this"                 Text.Numeral.Misc     ( intLog )
-import qualified "this"       Text.Numeral.Exp as E
+import "base" Data.Function ( fix )
+import           "this" Text.Numeral.Exp ( Side(L, R) )
+import qualified "this" Text.Numeral.Exp as E
+import qualified "this" Text.Numeral.Grammar as G
+import           "this" Text.Numeral.Misc ( intLog )
 import qualified "fingertree" Data.IntervalMap.FingerTree as FT
     ( Interval(Interval)
     , IntervalMap, empty, insert
@@ -68,9 +58,9 @@
 --------------------------------------------------------------------------------
 
 -- | A rule on how to convert a number into an expression
--- language. Notice how this type is equal to the type of the '$'
+-- language. Notice how this type is similar to the type of the '$'
 -- operator.
-type Rule α β = (α → β) → (α → β)
+type Rule a = (a -> E.Exp) -> (a -> E.Exp)
 
 
 --------------------------------------------------------------------------------
@@ -81,38 +71,37 @@
 -- | The \'if-then-else\' concept for rules. Applies the first rule if
 -- the predicate holds on the input value, otherwise applies the
 -- second rule.
-conditional ∷ (α → Bool) -- ^ Predicate on input value (\"if\").
-            → Rule α β -- ^ Rule to apply when predicate holds (\"then\").
-            → Rule α β -- ^ Rule to apply when predicate does not hold (\"else\").
-            → Rule α β
-conditional p t e = \f n → if p n
+conditional :: (a -> Bool) -- ^ Predicate on input value (\"if\").
+            -> Rule a -- ^ Rule to apply when predicate holds (\"then\").
+            -> Rule a -- ^ Rule to apply when predicate does not hold (\"else\").
+            -> Rule a
+conditional p t e = \f n -> if p n
                            then t f n
                            else e f n
 
--- | Tries to apply the first rule, if that produces an 'E.unknown'
+-- | Tries to apply the first rule, if that produces an 'E.Unknown'
 -- value it applies the second rule.
-combine ∷ (E.Unknown β)
-        ⇒ Rule α β
-        → Rule α β
-        → Rule α β
-combine r1 r2 = \f n → case r1 f n of
-                         x | E.isUnknown x → r2 f n
-                           | otherwise     → x
+combine :: Rule a
+        -> Rule a
+        -> Rule a
+combine r1 r2 = \f n -> case r1 f n of
+                          E.Unknown -> r2 f n
+                          x         -> x
 
 -- | Transform a value before it is given to a rule.
-mapRule ∷ (α → α) → Rule α β → Rule α β
-mapRule g r = \f n → r f (g n)
+mapRule :: (a -> a) -> Rule a -> Rule a
+mapRule g r = \f n -> r f (g n)
 
 -- | Chooses which rule to apply to an input value based on a interval
 -- list of rules.
-findRule ∷ (Ord α, Num α, E.Unknown β)
-         ⇒ (α, Rule α β)   -- ^ First interval rule.
-         → [(α, Rule α β)] -- ^ Interval rule list.
-         → α               -- ^ Upper bound of the last interval.
-         → Rule α β
-findRule x xs end = \f n → case FT.search n xm of
-                             [] → E.unknown
-                             (_,r):_ → r f n
+findRule :: (Ord a, Num a)
+         => (a, Rule a)   -- ^ First interval rule.
+         -> [(a, Rule a)] -- ^ Interval rule list.
+         -> a             -- ^ Upper bound of the last interval.
+         -> Rule a
+findRule x xs end = \f n -> case FT.search n xm of
+                             [] -> E.Unknown
+                             (_,r):_ -> r f n
     where
       xm = mkIntervalMap $ mkIntervalList x xs end
 
@@ -126,8 +115,8 @@
 --
 -- >>> (fix unknown) (3 :: Integer) :: Exp
 -- Unknown
-unknown ∷ (E.Unknown β) ⇒ Rule α β
-unknown _ _ = E.unknown
+unknown :: Rule a
+unknown _ = const E.Unknown
 
 -- | The literal rule. Converts its argument into a 'E.lit'eral
 -- expression.
@@ -143,8 +132,8 @@
 -- Lit 3
 -- >>> (fix lit) (3 :: Integer) :: Exp
 -- Lit 3
-lit ∷ (Integral α, E.Lit β) ⇒ Rule α β
-lit = const $ E.lit ∘ fromIntegral
+lit :: (Integral a) => Rule a
+lit = const $ E.Lit . fromIntegral
 
 -- | A variant on the 'lit' rule which always multiplies its argument
 -- with 1. Useful for languages which have numerals of the form \"one
@@ -152,8 +141,8 @@
 --
 -- >>> lit1 (fix unknown) (3 :: Integer) :: Exp
 -- Mul (Lit 1) (Lit 3)
-lit1 ∷ (Integral α, E.Lit β, E.Mul β) ⇒ Rule α β
-lit1 = const $ \n → E.lit 1 `E.mul` E.lit (fromIntegral n)
+lit1 :: (Integral a) => Rule a
+lit1 = const $ \n -> E.Lit 1 `E.Mul` E.Lit (fromIntegral n)
 
 -- |
 --
@@ -161,10 +150,10 @@
 -- Lit 3
 -- >>> (pos $ lit $ fix unknown) (-3 :: Integer) :: Exp
 -- Neg (Lit 3)
-pos ∷ (Ord α, Num α, E.Lit β, E.Neg β) ⇒ Rule α β
-pos f n | n < 0     = E.neg $ f (abs n)
+pos :: (Ord a, Num a) => Rule a
+pos f n | n < 0     = E.Neg $ f (abs n)
         | n > 0     = f n
-        | otherwise = E.lit 0
+        | otherwise = E.Lit 0
 
 -- |
 --
@@ -172,202 +161,208 @@
 -- Lit 3
 -- >>> (checkPos $ lit $ fix unknown) (-3 :: Integer) :: Exp
 -- Unknown
-checkPos ∷ (Ord α, Num α, E.Unknown β, E.Lit β) ⇒ Rule α β
-checkPos f n | n < 0     = E.unknown
+checkPos :: (Ord a, Num a) => Rule a
+checkPos f n | n < 0     = E.Unknown
              | n > 0     = f n
-             | otherwise = E.lit 0
-
--- |
---
--- >>> (dual $ lit $ fix unknown) (3 :: Integer) :: Exp
--- Dual (Lit 3)
-dual ∷ (E.Dual β) ⇒ Rule α β
-dual = (∘) E.dual
-
--- |
---
--- >>> (plural $ lit $ fix unknown) (3 :: Integer) :: Exp
--- Plural (Lit 3)
-plural ∷ (E.Plural β) ⇒ Rule α β
-plural = (∘) E.plural
+             | otherwise = E.Lit 0
 
--- | Changes the inflection of a subexpression.
-inflection ∷ (E.Inflection β) ⇒ (E.Inf β → E.Inf β) → Rule α β
-inflection changeInf = \f n → E.inflection changeInf $ f n
+-- -- | Changes the inflection of a subexpression.
+-- inflection :: (E.Inflection b) => (Inflection -> Inflection) -> Rule a
+-- inflection changeInf = \f n -> E.inflection changeInf $ f n
 
 -- |
 --
 -- >>> (add 10 L $ lit $ fix unknown) (13 :: Integer) :: Exp
 -- Add (Lit 3) (Lit 10)
-add ∷ (Num α, E.Add β) ⇒ α → Side → Rule α β
-add val s = \f n → (flipIfR s E.add) (f $ n - val) (f val)
+add :: (Num a) => a -> Side -> Rule a
+add val s = \f n -> (flipIfR s E.Add) (f $ n - val) (f val)
 
 -- |
 --
 -- >>> (mul 10 R L $ lit $ fix unknown) (42 :: Integer) :: Exp
 -- Add (Mul (Lit 4) (Lit 10)) (Lit 2)
-mul ∷ (Integral α, E.Add β, E.Mul β) ⇒ α → Side → Side → Rule α β
+mul :: (Integral a) => a -> Side -> Side -> Rule a
 mul val aSide mSide =
-    \f n → let (m, a) = n `divMod` val
-               mval = (flipIfR mSide E.mul) (f m) (f val)
-           in if a ≡ 0
-              then mval
-              else (flipIfR aSide E.add) (f a) mval
+    \f n -> let (m, a) = n `divMod` val
+                mval = (flipIfR mSide E.Mul) (f m) (f val)
+            in if a == 0
+               then mval
+               else (flipIfR aSide E.Add) (f a) mval
 
-mul1 ∷ (Integral α, E.Lit β, E.Add β, E.Mul β)
-     ⇒ α → Side → Side → Rule α β
+mul1 :: (Integral a) => a -> Side -> Side -> Rule a
 mul1 val aSide mSide =
-    \f n → let (m, a) = n `divMod` val
-               mval = if m ≡ 1
-                      then E.lit 1 ⊡ E.lit (fromIntegral val)
-                      else f m ⊡ E.lit (fromIntegral val)
-           in if a ≡ 0
-              then mval
-              else (flipIfR aSide E.add) (f a) mval
+    \f n -> let (m, a) = n `divMod` val
+                mval = if m == 1
+                       then E.Lit 1 ⊡ E.Lit (fromIntegral val)
+                       else f m     ⊡ E.Lit (fromIntegral val)
+            in if a == 0
+               then mval
+               else (flipIfR aSide E.Add) (f a) mval
   where
-     (⊡) = flipIfR mSide E.mul
+     (⊡) = flipIfR mSide E.Mul
 
 -- |
 --
 -- >>> (sub 20 $ lit $ fix unknown) (18 :: Integer) :: Exp
 -- Sub (Lit 2) (Lit 20)
-sub ∷ (Integral α, E.Sub β) ⇒ α → Rule α β
-sub val = \f n → E.sub (f $ val - n) (f val)
+sub :: (Integral a) => a -> Rule a
+sub val = \f n -> E.Sub (f $ val - n) (f val)
 
-mkStep ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β)
-       ⇒ Rule α β                     -- ^ lit rule
-       → (α → Side → Rule α β)        -- ^ add rule
-       → (α → Side → Side → Rule α β) -- ^ mul rule
-       → α → α → Side → Side → Rule α β
+mkStep :: (Integral a)
+       => Rule a                        -- ^ lit rule
+       -> (a -> Side -> Rule a)         -- ^ add rule
+       -> (a -> Side -> Side -> Rule a) -- ^ mul rule
+       -> a -> a -> Side -> Side -> Rule a
 mkStep lr ar mr val r aSide mSide
-       f n | n < val   = E.unknown
-           | n ≡ val   = lr                 f n
-           | n < val⋅2 = ar val aSide       f n
-           | n < val⋅r = mr val aSide mSide f n
-           | otherwise = E.unknown
+       f n | n <  val   = E.Unknown
+           | n == val   = lr                 f n
+           | n <  val*2 = ar val aSide       f n
+           | n <  val*r = mr val aSide mSide f n
+           | otherwise  = E.Unknown
 
-step ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β)
-     ⇒ α → α → Side → Side → Rule α β
+step :: (Integral a) => a -> a -> Side -> Side -> Rule a
 step = mkStep lit add mul
 
-step1 ∷ (Integral α, E.Unknown β, E.Lit β, E.Add β, E.Mul β)
-      ⇒ α → α → Side → Side → Rule α β
+step1 :: (Integral a) => a -> a -> Side -> Side -> Rule a
 step1 = mkStep lit1 add mul1
 
-mulScale_ ∷ (Integral α, E.Scale α, E.Unknown β, E.Add β, E.Mul β, E.Scale β)
-          ⇒ ( (α → β) -- Parent rule.
-            → α       -- First multiplication value (not converted).
-            → β       -- Second multiplication value (scale step,
-                      -- already converted).
-            → Side    -- Multiplication side.
-            → β
-            )        -- ^ Performs the multiplication.
-          → α        -- ^ Base.
-          → α        -- ^ Offset.
-          → Side     -- ^ Add side.
-          → Side     -- ^ Mul side.
-          → Rule α β -- ^ Big num rule.
-          → Rule α β
+mulScale_ :: forall a. (Integral a)
+          => ( (a -> E.Exp) -- Parent rule.
+             -> a       -- First multiplication value (not converted).
+             -> E.Exp   -- Second multiplication value (scale step,
+                        -- already converted).
+             -> Side    -- Multiplication side.
+             -> E.Exp
+             )      -- ^ Performs the multiplication.
+          -> a      -- ^ Base.
+          -> a      -- ^ Offset.
+          -> Side   -- ^ Add side.
+          -> Side   -- ^ Mul side.
+          -> Rule a -- ^ Big num rule.
+          -> Rule a
 mulScale_ doMul base offset aSide mSide bigNumRule =
-    \f n → let rank    = (intLog n - offset) `div` base
-               base'   = fromIntegral base
-               offset' = fromIntegral offset
-               rank'   = fromIntegral rank
-               rankExp = (fix bigNumRule) rank
-               (m, a)  = n `divMod` E.scale base' offset' rank'
-               scale'  = E.scale base' offset' rankExp
-               mval    = doMul f m scale' mSide
-           in if E.isUnknown rankExp
-              then E.unknown
-              else if a ≡ 0
-                   then mval
-                   else (flipIfR aSide E.add) (f a) mval
+    \f n -> let rank = (intLog n - offset) `div` base
 
-mulScale ∷ (Integral α, E.Scale α, E.Unknown β, E.Add β, E.Mul β, E.Scale β)
-         ⇒ α        -- ^ Base.
-         → α        -- ^ Offset.
-         → Side     -- ^ Add side.
-         → Side     -- ^ Mul side.
-         → Rule α β -- ^ Big num rule.
-         → Rule α β
-mulScale = mulScale_ $ \f m scale' mSide →
+                base' :: Integer
+                base' = fromIntegral base
+
+                offset' :: Integer
+                offset' = fromIntegral offset
+
+                rankExp :: E.Exp
+                rankExp = (fix bigNumRule) rank
+
+                m, a :: a
+                (m, a) = n `divMod` E.evalScale base offset rank
+
+                scale' :: E.Exp
+                scale' = E.Scale base' offset' rankExp
+
+                mval = doMul f m scale' mSide
+
+            in case rankExp of
+                 E.Unknown -> E.Unknown
+                 _ -> if a == 0
+                      then mval
+                      else (flipIfR aSide E.Add) (f a) mval
+
+mulScale :: (Integral a)
+         => a      -- ^ Base.
+         -> a      -- ^ Offset.
+         -> Side   -- ^ Add side.
+         -> Side   -- ^ Mul side.
+         -> Rule a -- ^ Big num rule.
+         -> Rule a
+mulScale = mulScale_ $ \f m scale' mSide ->
                          case m of
-                           1 → scale'
-                           _ → (flipIfR mSide E.mul) (f m) scale'
+                           1 -> scale'
+                           _ -> (flipIfR mSide E.Mul) (f m) scale'
 
-mulScale1 ∷ (Integral α, E.Scale α, E.Unknown β, E.Add β, E.Mul β, E.Scale β)
-          ⇒ α        -- ^ Base.
-          → α        -- ^ Offset.
-          → Side     -- ^ Add side.
-          → Side     -- ^ Mul side.
-          → Rule α β -- ^ Big num rule.
-          → Rule α β
-mulScale1 = mulScale_ $ \f m scale' mSide → (flipIfR mSide E.mul) (f m) scale'
+mulScale1 :: (Integral a)
+          => a      -- ^ Base.
+          -> a      -- ^ Offset.
+          -> Side   -- ^ Add side.
+          -> Side   -- ^ Mul side.
+          -> Rule a -- ^ Big num rule.
+          -> Rule a
+mulScale1 = mulScale_ $ \f m scale' mSide -> (flipIfR mSide E.Mul) (f m) scale'
 
-shortScale ∷ (Integral α, E.Scale α, E.Unknown β, E.Add β, E.Mul β, E.Scale β)
-           ⇒ Side     -- ^ Add side.
-           → Side     -- ^ Mul side.
-           → Rule α β -- ^ Big num rule.
-           → Rule α β
+shortScale :: (Integral a)
+           => Side   -- ^ Add side.
+           -> Side   -- ^ Mul side.
+           -> Rule a -- ^ Big num rule.
+           -> Rule a
 shortScale = mulScale 3 3
 
-shortScale1 ∷ (Integral α, E.Scale α, E.Unknown β, E.Add β, E.Mul β, E.Scale β)
-            ⇒ Side     -- ^ Add side.
-            → Side     -- ^ Mul side.
-            → Rule α β -- ^ Big num rule.
-            → Rule α β
+shortScale1 :: (Integral a)
+            => Side   -- ^ Add side.
+            -> Side   -- ^ Mul side.
+            -> Rule a -- ^ Big num rule.
+            -> Rule a
 shortScale1 = mulScale1 3 3
 
-longScale ∷ (Integral α, E.Scale α, E.Unknown β, E.Add β, E.Mul β, E.Scale β)
-          ⇒ Side     -- ^ Add side.
-          → Side     -- ^ Mul side.
-          → Rule α β -- ^ Big num rule.
-          → Rule α β
+longScale :: (Integral a)
+          => Side   -- ^ Add side.
+          -> Side   -- ^ Mul side.
+          -> Rule a -- ^ Big num rule.
+          -> Rule a
 longScale = mulScale 6 0
 
-longScale1 ∷ (Integral α, E.Scale α, E.Unknown β, E.Add β, E.Mul β, E.Scale β)
-           ⇒ Side     -- ^ Add side.
-           → Side     -- ^ Mul side.
-           → Rule α β -- ^ Big num rule.
-           → Rule α β
+longScale1 :: (Integral a)
+           => Side   -- ^ Add side.
+           -> Side   -- ^ Mul side.
+           -> Rule a -- ^ Big num rule.
+           -> Rule a
 longScale1 = mulScale1 6 0
 
-pelletierScale ∷ (Integral α, E.Scale α, E.Unknown β, E.Add β, E.Mul β, E.Scale β)
-               ⇒ Side     -- ^ Add side.
-               → Side     -- ^ Mul side.
-               → Rule α β -- ^ Big num rule.
-               → Rule α β
+pelletierScale :: (Integral a)
+               => Side   -- ^ Add side.
+               -> Side   -- ^ Mul side.
+               -> Rule a -- ^ Big num rule.
+               -> Rule a
 pelletierScale aSide mSide bigNumRule =
-    conditional (\n → even $ intLog n `div` 3)
+    conditional (\n -> even $ intLog n `div` 3)
                 (mulScale 6 0 aSide mSide bigNumRule)
                 (mulScale 6 3 aSide mSide bigNumRule)
 
-pelletierScale1 ∷ (Integral α, E.Scale α, E.Unknown β, E.Add β, E.Mul β, E.Scale β)
-                ⇒ Side     -- ^ Add side.
-                → Side     -- ^ Mul side.
-                → Rule α β -- ^ Big num rule.
-                → Rule α β
+pelletierScale1 :: (Integral a)
+                => Side   -- ^ Add side.
+                -> Side   -- ^ Mul side.
+                -> Rule a -- ^ Big num rule.
+                -> Rule a
 pelletierScale1 aSide mSide bigNumRule =
-    conditional (\n → even $ intLog n `div` 3)
+    conditional (\n -> even $ intLog n `div` 3)
                 (mulScale1 6 0 aSide mSide bigNumRule)
                 (mulScale1 6 3 aSide mSide bigNumRule)
 
 
 --------------------------------------------------------------------------------
+-- Grammar Rules
+--------------------------------------------------------------------------------
+
+changeCase :: Maybe G.Case -> Rule a
+changeCase mbCase = \f n -> E.ChangeCase mbCase $ f n
+
+changeGender :: Maybe G.Gender -> Rule a
+changeGender mbGender = \f n -> E.ChangeGender mbGender $ f n
+
+changeNumber :: Maybe G.Number -> Rule a
+changeNumber mbNumber = \f n -> E.ChangeNumber mbNumber $ f n
+
+--------------------------------------------------------------------------------
 -- Miscellaneous
 --------------------------------------------------------------------------------
 
-flipIfR ∷ Side → (α → α → α) → (α → α → α)
+flipIfR :: Side -> (a -> a -> a) -> (a -> a -> a)
 flipIfR L = id
 flipIfR R = flip
 
-mkIntervalList ∷ (Num a) ⇒ (a, b) → [(a, b)] → a → [((a, a), b)]
+mkIntervalList :: (Num a) => (a, b) -> [(a, b)] -> a -> [((a, a), b)]
 mkIntervalList (k, r) krs end = go k r krs
     where
       go k1 r1 []            = [((k1, end), r1)]
       go k1 r1 ((k2, r2):xs) = ((k1, k2-1), r1) : go k2 r2 xs
 
-mkIntervalMap ∷ (Ord v) ⇒ [((v, v), α)] → FT.IntervalMap v α
+mkIntervalMap :: (Ord v) => [((v, v), a)] -> FT.IntervalMap v a
 mkIntervalMap = foldr ins FT.empty
   where ins ((lo, hi), n) = FT.insert (FT.Interval lo hi) n
-
