diff --git a/src/Data/Validity/CaseInsensitive.hs b/src/Data/Validity/CaseInsensitive.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Validity/CaseInsensitive.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Data.Validity.CaseInsensitive where
+
+import Data.CaseInsensitive (CI)
+import qualified Data.CaseInsensitive as CI
+import Data.Validity
+
+instance (Validity a, Eq a, CI.FoldCase a) => Validity (CI a) where
+  validate ci =
+    mconcat
+      [ delve "original" $ CI.original ci,
+        delve "foldedCase" $ CI.foldedCase ci,
+        -- The following could go wrong when using unsafeMk:
+        declare "The foldedCase is indeed folded correctly" $
+          CI.foldedCase ci == CI.foldCase (CI.original ci)
+      ]
diff --git a/test/Data/Validity/CaseInsensitiveSpec.hs b/test/Data/Validity/CaseInsensitiveSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Validity/CaseInsensitiveSpec.hs
@@ -0,0 +1,17 @@
+module Data.Validity.CaseInsensitiveSpec
+  ( spec,
+  )
+where
+
+import qualified Data.CaseInsensitive as CI
+import qualified Data.CaseInsensitive.Unsafe as CI
+import Data.Validity.CaseInsensitive ()
+import Test.Hspec
+import Test.Validity
+
+spec :: Spec
+spec = do
+  it "says that this case-insensitive string is valid" $
+    shouldBeValid $ CI.mk "hello world"
+  it "says that this unsafely constructed unfolded string is invalid" $
+    shouldBeInvalid $ CI.unsafeMk "HeLlO wOrLd"
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
diff --git a/validity-case-insensitive.cabal b/validity-case-insensitive.cabal
new file mode 100644
--- /dev/null
+++ b/validity-case-insensitive.cabal
@@ -0,0 +1,49 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.34.6.
+--
+-- see: https://github.com/sol/hpack
+
+name:           validity-case-insensitive
+version:        0.0.0.0
+synopsis:       Validity instances for case-insensitive
+category:       Validity
+homepage:       https://github.com/NorfairKing/validity#readme
+bug-reports:    https://github.com/NorfairKing/validity/issues
+license:        MIT
+build-type:     Simple
+
+source-repository head
+  type: git
+  location: https://github.com/NorfairKing/validity
+
+library
+  exposed-modules:
+      Data.Validity.CaseInsensitive
+  other-modules:
+      Paths_validity_case_insensitive
+  hs-source-dirs:
+      src
+  build-depends:
+      base >=4.7 && <5
+    , case-insensitive
+    , validity >=0.9.0.2
+  default-language: Haskell2010
+
+test-suite validity-case-insensitive-test
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
+  other-modules:
+      Data.Validity.CaseInsensitiveSpec
+      Paths_validity_case_insensitive
+  hs-source-dirs:
+      test
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+  build-depends:
+      base >=4.7 && <5
+    , case-insensitive
+    , genvalidity-hspec
+    , hspec
+    , validity >=0.9.0.2
+    , validity-case-insensitive
+  default-language: Haskell2010
