diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for byteslice
 
+## 0.2.15.0 -- 2024-06-12
+
+* Add functions for recovering length from `ByteArrayN`
+* Add `Data.Bytes.Indexed` for functions on `ByteArrayN`
+
 ## 0.2.14.0 -- 2024-02-26
 
 * Add functions to `Data.Bytes.Text.AsciiExt`: `split(1|2|3|4)`,
diff --git a/byteslice.cabal b/byteslice.cabal
--- a/byteslice.cabal
+++ b/byteslice.cabal
@@ -1,6 +1,6 @@
 cabal-version:   2.4
 name:            byteslice
-version:         0.2.14.0
+version:         0.2.15.0
 synopsis:        Slicing managed and unmanaged memory
 description:
   This library provides types that allow the user to talk about a slice of
@@ -35,6 +35,7 @@
   exposed-modules:
     Data.Bytes
     Data.Bytes.Chunks
+    Data.Bytes.Indexed
     Data.Bytes.Encode.BigEndian
     Data.Bytes.Encode.LittleEndian
     Data.Bytes.Internal
diff --git a/src/Data/Bytes/Indexed.hs b/src/Data/Bytes/Indexed.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bytes/Indexed.hs
@@ -0,0 +1,35 @@
+{-# language DataKinds #-}
+{-# language MagicHash #-}
+{-# language TypeOperators #-}
+
+module Data.Bytes.Indexed
+  ( ByteArrayN
+  , append
+  , length
+  , length#
+  ) where
+
+import Prelude hiding (length)
+
+import Data.Primitive (ByteArray(ByteArray))
+import Data.Bytes.Types (ByteArrayN(ByteArrayN))
+import GHC.TypeNats (type (+))
+import Arithmetic.Types (Nat, Nat#)
+
+import qualified Data.Primitive as PM
+import qualified Arithmetic.Unsafe as Unsafe
+import qualified GHC.Exts as Exts
+
+append :: ByteArrayN m -> ByteArrayN n -> ByteArrayN (m + n)
+{-# inline append #-}
+append (ByteArrayN x) (ByteArrayN y) = ByteArrayN (x <> y)
+
+-- | Recover a witness of the length.
+length :: ByteArrayN n -> Nat n
+{-# inline length #-}
+length (ByteArrayN x) = Unsafe.Nat (PM.sizeofByteArray x)
+
+-- | Recover an unboxed witness of the length.
+length# :: ByteArrayN n -> Nat# n
+{-# inline length# #-}
+length# (ByteArrayN (ByteArray x)) = Unsafe.Nat# (Exts.sizeofByteArray# x)
