diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Changelog
 
+## [0.3.1.1] - 2024-10-31
+
+- Add `Hashable` and `NFData` instances to `NonEmptyText`.
+- Add `Data`, `Ord`, `Hashable` and `NFData` instances to `NullableNonEmptyText`.
+- Add dependencies on `deepseq` and `hashable`.
+
 ## [0.3.1.0] - 2024-02-29
 
 - Add `Data` instance to `NonEmptyText`.
diff --git a/src/Data/StringVariants/NonEmptyText/Internal.hs b/src/Data/StringVariants/NonEmptyText/Internal.hs
--- a/src/Data/StringVariants/NonEmptyText/Internal.hs
+++ b/src/Data/StringVariants/NonEmptyText/Internal.hs
@@ -11,11 +11,13 @@
 
 module Data.StringVariants.NonEmptyText.Internal where
 
+import Control.DeepSeq (NFData)
 import Control.Monad (when)
 import Data.Aeson (FromJSON (..), ToJSON, withText)
 import Data.ByteString
 import Data.Coerce
 import Data.Data (Data)
+import Data.Hashable (Hashable)
 import Data.MonoTraversable
 import Data.Proxy
 import Data.Sequences
@@ -33,7 +35,7 @@
 -- | Non Empty Text, requires the input is between 1 and @n@ chars and not just whitespace.
 newtype NonEmptyText (n :: Nat) = NonEmptyText Text
   deriving stock (Data, Generic, Show, Read, Lift)
-  deriving newtype (Eq, Ord, ToJSON, MonoFoldable)
+  deriving newtype (Eq, Ord, ToJSON, MonoFoldable, Hashable, NFData)
 
 type instance Element (NonEmptyText _n) = Char
 
diff --git a/src/Data/StringVariants/NullableNonEmptyText.hs b/src/Data/StringVariants/NullableNonEmptyText.hs
--- a/src/Data/StringVariants/NullableNonEmptyText.hs
+++ b/src/Data/StringVariants/NullableNonEmptyText.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE UndecidableInstances #-}
@@ -30,14 +31,18 @@
   )
 where
 
+import Control.DeepSeq (NFData)
 import Control.Monad
 import Data.Aeson
 import Data.Aeson qualified as J
 import Data.Aeson.Key qualified as J
 import Data.Aeson.Types qualified as J
-import Data.Data (Proxy (..))
+import Data.Data (Data, Proxy (..))
+import Data.Hashable (Hashable)
 import Data.Maybe (fromMaybe)
+import Data.MonoTraversable (MonoFoldable)
 import Data.StringVariants.NonEmptyText
+import Data.StringVariants.NonEmptyText.Internal (NonEmptyText (..))
 import Data.StringVariants.Util
 import Data.Text (Text)
 import Data.Text qualified as T
@@ -80,8 +85,8 @@
 --
 --   Use 'nullableNonEmptyTextToMaybeNonEmptyText' to extract @Maybe (NonEmptyText n)@ from @NullableNonEmptyText n@.
 newtype NullableNonEmptyText n = NullableNonEmptyText (Maybe (NonEmptyText n))
-  deriving stock (Generic, Show, Read, Lift)
-  deriving newtype (Eq)
+  deriving stock (Data, Generic, Show, Read, Lift)
+  deriving newtype (Eq, Ord, Hashable, NFData)
 
 mkNullableNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NullableNonEmptyText n)
 mkNullableNonEmptyText t
diff --git a/string-variants.cabal b/string-variants.cabal
--- a/string-variants.cabal
+++ b/string-variants.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           string-variants
-version:        0.3.1.0
+version:        0.3.1.1
 synopsis:       Constrained text newtypes
 description:    See README at <https://github.com/MercuryTechnologies/string-variants#readme>.
 category:       Data
@@ -79,6 +79,8 @@
     , aeson >=2.0.0.0
     , base >=4.16 && <5
     , bytestring
+    , deepseq
+    , hashable
     , mono-traversable
     , refined
     , string-conversions
