diff --git a/hw-prim.cabal b/hw-prim.cabal
--- a/hw-prim.cabal
+++ b/hw-prim.cabal
@@ -1,5 +1,5 @@
 name:                   hw-prim
-version:                0.4.0.1
+version:                0.4.0.2
 synopsis:               Primitive functions and data types
 description:            Please see README.md
 homepage:               http://github.com/haskell-works/hw-prim#readme
@@ -28,6 +28,7 @@
                       , HaskellWorks.Data.FromByteString
                       , HaskellWorks.Data.FromForeignRegion
                       , HaskellWorks.Data.Generate
+                      , HaskellWorks.Data.Head
                       , HaskellWorks.Data.Length
                       , HaskellWorks.Data.Naive
                       , HaskellWorks.Data.Positioning
diff --git a/src/HaskellWorks/Data/Head.hs b/src/HaskellWorks/Data/Head.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Data/Head.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeFamilies          #-}
+
+module HaskellWorks.Data.Head
+    ( Container(..)
+    , Head(..)
+    ) where
+
+import qualified Data.ByteString               as BS
+import           Data.Int
+import qualified Data.List                     as L
+import qualified Data.Vector                   as DV
+import qualified Data.Vector.Storable          as DVS
+import           Data.Word
+import           HaskellWorks.Data.Container
+import           Prelude hiding (head)
+
+class Container v => Head v where
+  head :: v -> Elem v
+
+instance Head [a] where
+  head = L.head
+  {-# INLINE head #-}
+
+instance Head BS.ByteString where
+  head = BS.head
+  {-# INLINE head #-}
+
+instance Head (DV.Vector Word8) where
+  head = DV.head
+  {-# INLINE head #-}
+
+instance Head (DV.Vector Word16) where
+  head = DV.head
+  {-# INLINE head #-}
+
+instance Head (DV.Vector Word32) where
+  head = DV.head
+  {-# INLINE head #-}
+
+instance Head (DV.Vector Word64) where
+  head = DV.head
+  {-# INLINE head #-}
+
+instance Head (DVS.Vector Word8) where
+  head = DVS.head
+  {-# INLINE head #-}
+
+instance Head (DVS.Vector Word16) where
+  head = DVS.head
+  {-# INLINE head #-}
+
+instance Head (DVS.Vector Word32) where
+  head = DVS.head
+  {-# INLINE head #-}
+
+instance Head (DVS.Vector Word64) where
+  head = DVS.head
+  {-# INLINE head #-}
+
+instance Head (DV.Vector Int8) where
+  head = DV.head
+  {-# INLINE head #-}
+
+instance Head (DV.Vector Int16) where
+  head = DV.head
+  {-# INLINE head #-}
+
+instance Head (DV.Vector Int32) where
+  head = DV.head
+  {-# INLINE head #-}
+
+instance Head (DV.Vector Int64) where
+  head = DV.head
+  {-# INLINE head #-}
+
+instance Head (DVS.Vector Int8) where
+  head = DVS.head
+  {-# INLINE head #-}
+
+instance Head (DVS.Vector Int16) where
+  head = DVS.head
+  {-# INLINE head #-}
+
+instance Head (DVS.Vector Int32) where
+  head = DVS.head
+  {-# INLINE head #-}
+
+instance Head (DVS.Vector Int64) where
+  head = DVS.head
+  {-# INLINE head #-}
+
+instance Head (DVS.Vector Int) where
+  head = DVS.head
+  {-# INLINE head #-}
