diff --git a/country.cabal b/country.cabal
--- a/country.cabal
+++ b/country.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.2
 name: country
-version: 0.2.4.0
+version: 0.2.4.1
 synopsis: Country data type and functions
 description:
   The `country` library provides a data type for dealing with
@@ -61,7 +61,7 @@
     Country.Unexposed.TrieByte
     Country.Unexposed.Util
   build-depends:
-    , aeson >=1.2 && <2.2
+    , aeson >=1.2 && <2.3
     , attoparsec >=0.13 && <0.15
     , base >=4.12 && <5
     , bytebuild >=0.3.4 && <0.4
@@ -72,10 +72,10 @@
     , deepseq >= 1.3.0.2 && <1.5
     , entropy >=0.4.1.5 && <0.5
     , hashable >=1.2 && <1.5
-    , primitive >= 0.6.4 && <0.9
+    , primitive >= 0.6.4 && <0.10
     , primitive-unlifted >= 2.1
     , scientific >=0.3 && <0.4
-    , text >= 2.0 && <2.1
+    , text >= 2.0 && <2.2
     , text-short >=0.1.3
     , unordered-containers >=0.2 && <0.3
   default-language: Haskell2010
diff --git a/src/Country.hs b/src/Country.hs
--- a/src/Country.hs
+++ b/src/Country.hs
@@ -40,13 +40,13 @@
 import Country.Unexposed.Names (numberOfPossibleCodes,alphaTwoHashMap,alphaThreeHashMap,decodeMap,decodeMapUtf8,decodeNumeric,encodeEnglish,encodeEnglishShort)
 import Country.Unexposed.Trie (Trie,trieFromList,trieParser)
 import Country.Unexposed.TrieByte (TrieByte,trieByteFromList,trieByteParser)
-import Country.Unexposed.Util (mapTextArray,charToWord8,word16ToInt,timesTwo,timesThree)
+import Country.Unexposed.Util (newZeroedByteArray,mapTextArray,charToWord8,word16ToInt,timesTwo,timesThree)
 import Country.Unsafe (Country(..))
 import Data.Bytes.Types (Bytes(Bytes))
 import Data.ByteString (ByteString)
 import Data.Char (toLower)
 import Data.Coerce (coerce)
-import Data.Primitive (writeByteArray,indexByteArray,unsafeFreezeByteArray,newByteArray)
+import Data.Primitive (writeByteArray,indexByteArray,unsafeFreezeByteArray)
 import Data.Primitive.ByteArray (ByteArray(..))
 import Data.Primitive.Ptr (indexOffPtr)
 import Data.Text (Text)
@@ -146,7 +146,7 @@
 -- | The elements in this array are Word16
 positions :: ByteArray
 positions = runST $ do
-  m <- newByteArray (timesTwo numberOfPossibleCodes)
+  m <- newZeroedByteArray (timesTwo numberOfPossibleCodes)
   forM_ (zip (enumFrom (0 :: Word16)) countryNameQuads) $ \(ix,(n,_,_,_)) -> do
     writeByteArray m (word16ToInt n) ix
   unsafeFreezeByteArray m
diff --git a/src/Country/Unexposed/Names.hs b/src/Country/Unexposed/Names.hs
--- a/src/Country/Unexposed/Names.hs
+++ b/src/Country/Unexposed/Names.hs
@@ -32,6 +32,7 @@
 import Control.DeepSeq (NFData)
 import Country.Unexposed.Alias (aliases)
 import Country.Unexposed.Encode.English (countryNameQuads)
+import Country.Unexposed.Util (newZeroedByteArray)
 import Data.Bytes.Types (Bytes(Bytes))
 import Data.ByteString (ByteString)
 import Data.Char (toLower,isAlpha,toUpper)
@@ -40,7 +41,7 @@
 import Data.HashMap.Strict (HashMap)
 import Data.Primitive (Array,indexArray,newArray,unsafeFreezeArray,writeArray)
 import Data.Primitive (sizeOf)
-import Data.Primitive (writeByteArray,indexByteArray,unsafeFreezeByteArray,newByteArray)
+import Data.Primitive (writeByteArray,indexByteArray,unsafeFreezeByteArray)
 import Data.Primitive.ByteArray (ByteArray(..))
 import Data.Primitive.Types (Prim)
 import Data.Text (Text)
@@ -186,7 +187,7 @@
 
 countryCodeToSequentialMapping :: ByteArray
 countryCodeToSequentialMapping = runST $ do
-  numbers <- newByteArray (numberOfPossibleCodes * sizeOf (undefined :: Int))
+  numbers <- newZeroedByteArray (numberOfPossibleCodes * sizeOf (undefined :: Int))
   forM_ (zip [0 :: Int,1..] orderedCountryCodes) $ \(number,code) -> do
     writeByteArray numbers (word16ToInt code) number
   unsafeFreezeByteArray numbers
@@ -194,7 +195,7 @@
 
 sequentialToCountryCodeMapping :: ByteArray
 sequentialToCountryCodeMapping = runST $ do
-  codes <- newByteArray (actualNumberOfCountries * sizeOf (undefined :: Word16))
+  codes <- newZeroedByteArray (actualNumberOfCountries * sizeOf (undefined :: Word16))
   forM_ (zip [0 :: Int,1..] orderedCountryCodes) $ \(number,code) -> do
     writeByteArray codes number (code :: Word16)
   unsafeFreezeByteArray codes
@@ -235,11 +236,7 @@
 -- | The elements in this array are Word8 (basically boolean)
 numericValidities :: ByteArray
 numericValidities = runST $ do
-  m <- newByteArray numberOfPossibleCodes
-  let clear !ix = if ix < numberOfPossibleCodes
-        then writeByteArray m ix (0 :: Word8)
-        else return ()
-  clear 0
+  m <- newZeroedByteArray numberOfPossibleCodes
   forM_ countryNameQuads $ \(n,_,_,_) -> do
     writeByteArray m (word16ToInt n) (1 :: Word8)
   unsafeFreezeByteArray m
diff --git a/src/Country/Unexposed/Util.hs b/src/Country/Unexposed/Util.hs
--- a/src/Country/Unexposed/Util.hs
+++ b/src/Country/Unexposed/Util.hs
@@ -2,7 +2,8 @@
 {-# LANGUAGE MagicHash #-}
 
 module Country.Unexposed.Util
-  ( mapTextArray
+  ( newZeroedByteArray
+  , mapTextArray
   , charToWord8
   , word16ToChar
   , word16ToInt
@@ -11,14 +12,24 @@
   , half
   ) where
 
+import Control.Monad.Primitive (PrimMonad, PrimState)
 import Data.Bits (unsafeShiftL,unsafeShiftR)
 import Data.Char (chr,ord)
+import Data.Primitive.ByteArray (MutableByteArray,newByteArray,fillByteArray)
 import Data.Word (Word8,Word16)
 import GHC.Exts (sizeofByteArray#)
 import GHC.Int (Int(I#))
 
 import qualified Data.Text.Array as TA
 
+newZeroedByteArray :: PrimMonad m => Int -> m (MutableByteArray (PrimState m))
+newZeroedByteArray len = do
+  arr <- newByteArray len
+  let arrStart = 0
+  let zeroByte = 0
+  fillByteArray arr arrStart len zeroByte
+  pure arr
+{-# INLINE newZeroedByteArray #-}
 
 mapTextArray :: (Char -> Char) -> TA.Array -> TA.Array
 mapTextArray f a@(TA.ByteArray inner) = TA.run $ do
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -65,6 +65,8 @@
         ===
         (indexOffPtr ptr 0 :: Word8, indexOffPtr ptr 1 :: Word8)
       )
+  , testProperty "encode-decode-numeric"
+      (\x -> Just x === Country.decodeNumeric (Country.encodeNumeric x))
   , testGroup "Continent"
     [ testProperty "encode-decode-alpha-upper" $ \x ->
       Just x === Continent.decodeAlpha (Continent.alphaUpper x)
