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.1.0.2
+version:                0.1.0.3
 synopsis:               Primitive functions and data types
 description:            Please see README.md
 homepage:               http://github.com/haskell-works/hw-prim#readme
@@ -34,6 +34,7 @@
                       , HaskellWorks.Data.Positioning
                       , HaskellWorks.Data.Search
                       , HaskellWorks.Data.Seq
+                      , HaskellWorks.Data.Snoc
                       , HaskellWorks.Data.TreeCursor
                       , HaskellWorks.Data.Vector.BoxedVectorLike
                       , HaskellWorks.Data.Vector.StorableVectorLike
diff --git a/src/HaskellWorks/Data/Seq.hs b/src/HaskellWorks/Data/Seq.hs
--- a/src/HaskellWorks/Data/Seq.hs
+++ b/src/HaskellWorks/Data/Seq.hs
@@ -19,7 +19,6 @@
   vLength :: v -> Count
   vEnd :: v -> Position
   vEnd = fromIntegral . vLength
-  vSnoc :: v -> Elem v -> v
   vDrop :: Count -> v -> v
   vTake :: Count -> v -> v
   vUncons :: v -> Maybe (Elem v, v)
@@ -29,7 +28,6 @@
   vEmpty = ""
   vLength = Count . fromIntegral . length
   vEnd = fromIntegral . vLength
-  vSnoc v c = v ++ [c]
   vDrop = drop . fromIntegral
   vTake = take . fromIntegral
   vUncons s = case s of
@@ -39,7 +37,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -50,7 +47,6 @@
   vEmpty = BS.empty
   vLength = Count . fromIntegral . BS.length
   vEnd = fromIntegral . vLength
-  vSnoc = BS.snoc
   vDrop = BS.drop . fromIntegral
   vTake = BS.take . fromIntegral
   vUncons = BS.uncons
@@ -58,7 +54,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -69,7 +64,6 @@
   vEmpty = DV.empty
   vLength = Count . fromIntegral . DV.length
   vEnd = fromIntegral . vLength
-  vSnoc = DV.snoc
   vDrop = DV.drop . fromIntegral
   vTake = DV.take . fromIntegral
   vUncons s = if DV.length s == 0 then Nothing else Just (DV.head s, vDrop 1 s)
@@ -77,7 +71,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -88,7 +81,6 @@
   vEmpty = DV.empty
   vLength = Count . fromIntegral . DV.length
   vEnd = fromIntegral . vLength
-  vSnoc = DV.snoc
   vDrop = DV.drop . fromIntegral
   vTake = DV.take . fromIntegral
   vUncons s = if DV.length s == 0 then Nothing else Just (DV.head s, vDrop 1 s)
@@ -96,7 +88,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -107,7 +98,6 @@
   vEmpty = DV.empty
   vLength = Count . fromIntegral . DV.length
   vEnd = fromIntegral . vLength
-  vSnoc = DV.snoc
   vDrop = DV.drop . fromIntegral
   vTake = DV.take . fromIntegral
   vUncons s = if DV.length s == 0 then Nothing else Just (DV.head s, vDrop 1 s)
@@ -115,7 +105,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -126,7 +115,6 @@
   vEmpty = DV.empty
   vLength = Count . fromIntegral . DV.length
   vEnd = fromIntegral . vLength
-  vSnoc = DV.snoc
   vDrop = DV.drop . fromIntegral
   vTake = DV.take . fromIntegral
   vUncons s = if DV.length s == 0 then Nothing else Just (DV.head s, vDrop 1 s)
@@ -134,7 +122,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -145,7 +132,6 @@
   vEmpty = DVS.empty
   vLength = Count . fromIntegral . DVS.length
   vEnd = fromIntegral . vLength
-  vSnoc = DVS.snoc
   vDrop = DVS.drop . fromIntegral
   vTake = DVS.take . fromIntegral
   vUncons s = if DVS.length s == 0 then Nothing else Just (DVS.head s, vDrop 1 s)
@@ -153,7 +139,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -164,7 +149,6 @@
   vEmpty = DVS.empty
   vLength = Count . fromIntegral . DVS.length
   vEnd = fromIntegral . vLength
-  vSnoc = DVS.snoc
   vDrop = DVS.drop . fromIntegral
   vTake = DVS.take . fromIntegral
   vUncons s = if DVS.length s == 0 then Nothing else Just (DVS.head s, vDrop 1 s)
@@ -172,7 +156,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -183,7 +166,6 @@
   vEmpty = DVS.empty
   vLength = Count . fromIntegral . DVS.length
   vEnd = fromIntegral . vLength
-  vSnoc = DVS.snoc
   vDrop = DVS.drop . fromIntegral
   vTake = DVS.take . fromIntegral
   vUncons s = if DVS.length s == 0 then Nothing else Just (DVS.head s, vDrop 1 s)
@@ -191,7 +173,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -202,7 +183,6 @@
   vEmpty = DVS.empty
   vLength = Count . fromIntegral . DVS.length
   vEnd = fromIntegral . vLength
-  vSnoc = DVS.snoc
   vDrop = DVS.drop . fromIntegral
   vTake = DVS.take . fromIntegral
   vUncons s = if DVS.length s == 0 then Nothing else Just (DVS.head s, vDrop 1 s)
@@ -210,7 +190,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -221,7 +200,6 @@
   vEmpty = DV.empty
   vLength = Count . fromIntegral . DV.length
   vEnd = fromIntegral . vLength
-  vSnoc = DV.snoc
   vDrop = DV.drop . fromIntegral
   vTake = DV.take . fromIntegral
   vUncons s = if DV.length s == 0 then Nothing else Just (DV.head s, vDrop 1 s)
@@ -229,7 +207,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -240,7 +217,6 @@
   vEmpty = DV.empty
   vLength = Count . fromIntegral . DV.length
   vEnd = fromIntegral . vLength
-  vSnoc = DV.snoc
   vDrop = DV.drop . fromIntegral
   vTake = DV.take . fromIntegral
   vUncons s = if DV.length s == 0 then Nothing else Just (DV.head s, vDrop 1 s)
@@ -248,7 +224,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -259,7 +234,6 @@
   vEmpty = DV.empty
   vLength = Count . fromIntegral . DV.length
   vEnd = fromIntegral . vLength
-  vSnoc = DV.snoc
   vDrop = DV.drop . fromIntegral
   vTake = DV.take . fromIntegral
   vUncons s = if DV.length s == 0 then Nothing else Just (DV.head s, vDrop 1 s)
@@ -267,7 +241,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -278,7 +251,6 @@
   vEmpty = DV.empty
   vLength = Count . fromIntegral . DV.length
   vEnd = fromIntegral . vLength
-  vSnoc = DV.snoc
   vDrop = DV.drop . fromIntegral
   vTake = DV.take . fromIntegral
   vUncons s = if DV.length s == 0 then Nothing else Just (DV.head s, vDrop 1 s)
@@ -286,7 +258,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -297,7 +268,6 @@
   vEmpty = DVS.empty
   vLength = Count . fromIntegral . DVS.length
   vEnd = fromIntegral . vLength
-  vSnoc = DVS.snoc
   vDrop = DVS.drop . fromIntegral
   vTake = DVS.take . fromIntegral
   vUncons s = if DVS.length s == 0 then Nothing else Just (DVS.head s, vDrop 1 s)
@@ -305,7 +275,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -316,7 +285,6 @@
   vEmpty = DVS.empty
   vLength = Count . fromIntegral . DVS.length
   vEnd = fromIntegral . vLength
-  vSnoc = DVS.snoc
   vDrop = DVS.drop . fromIntegral
   vTake = DVS.take . fromIntegral
   vUncons s = if DVS.length s == 0 then Nothing else Just (DVS.head s, vDrop 1 s)
@@ -324,7 +292,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -335,7 +302,6 @@
   vEmpty = DVS.empty
   vLength = Count . fromIntegral . DVS.length
   vEnd = fromIntegral . vLength
-  vSnoc = DVS.snoc
   vDrop = DVS.drop . fromIntegral
   vTake = DVS.take . fromIntegral
   vUncons s = if DVS.length s == 0 then Nothing else Just (DVS.head s, vDrop 1 s)
@@ -343,7 +309,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -354,7 +319,6 @@
   vEmpty = DVS.empty
   vLength = Count . fromIntegral . DVS.length
   vEnd = fromIntegral . vLength
-  vSnoc = DVS.snoc
   vDrop = DVS.drop . fromIntegral
   vTake = DVS.take . fromIntegral
   vUncons s = if DVS.length s == 0 then Nothing else Just (DVS.head s, vDrop 1 s)
@@ -362,7 +326,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
@@ -373,7 +336,6 @@
   vEmpty = DVS.empty
   vLength = Count . fromIntegral . DVS.length
   vEnd = fromIntegral . vLength
-  vSnoc = DVS.snoc
   vDrop = DVS.drop . fromIntegral
   vTake = DVS.take . fromIntegral
   vUncons s = if DVS.length s == 0 then Nothing else Just (DVS.head s, vDrop 1 s)
@@ -381,7 +343,6 @@
   {-# INLINE vEmpty    #-}
   {-# INLINE vLength   #-}
   {-# INLINE vEnd      #-}
-  {-# INLINE vSnoc     #-}
   {-# INLINE vDrop     #-}
   {-# INLINE vTake     #-}
   {-# INLINE vUncons   #-}
diff --git a/src/HaskellWorks/Data/Snoc.hs b/src/HaskellWorks/Data/Snoc.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Data/Snoc.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeFamilies          #-}
+
+module HaskellWorks.Data.Snoc
+    ( Snoc(..)
+    ) where
+
+import qualified Data.ByteString               as BS
+import           Data.Int
+import qualified Data.Vector                   as DV
+import qualified Data.Vector.Storable          as DVS
+import           Data.Word
+import           HaskellWorks.Data.Seq
+
+class Seq v => Snoc v where
+  vSnoc :: v -> Elem v -> v
+
+instance Snoc String where
+  vSnoc v c = v ++ [c]
+  {-# INLINE vSnoc     #-}
+
+instance Snoc BS.ByteString where
+  vSnoc = BS.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DV.Vector Word8) where
+  vSnoc = DV.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DV.Vector Word16) where
+  vSnoc = DV.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DV.Vector Word32) where
+  vSnoc = DV.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DV.Vector Word64) where
+  vSnoc = DV.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DVS.Vector Word8) where
+  vSnoc = DVS.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DVS.Vector Word16) where
+  vSnoc = DVS.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DVS.Vector Word32) where
+  vSnoc = DVS.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DVS.Vector Word64) where
+  vSnoc = DVS.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DV.Vector Int8) where
+  vSnoc = DV.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DV.Vector Int16) where
+  vSnoc = DV.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DV.Vector Int32) where
+  vSnoc = DV.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DV.Vector Int64) where
+  vSnoc = DV.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DVS.Vector Int8) where
+  vSnoc = DVS.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DVS.Vector Int16) where
+  vSnoc = DVS.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DVS.Vector Int32) where
+  vSnoc = DVS.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DVS.Vector Int64) where
+  vSnoc = DVS.snoc
+  {-# INLINE vSnoc     #-}
+
+instance Snoc (DVS.Vector Int) where
+  vSnoc = DVS.snoc
+  {-# INLINE vSnoc     #-}
diff --git a/src/HaskellWorks/Data/Vector/VectorLike.hs b/src/HaskellWorks/Data/Vector/VectorLike.hs
--- a/src/HaskellWorks/Data/Vector/VectorLike.hs
+++ b/src/HaskellWorks/Data/Vector/VectorLike.hs
@@ -14,9 +14,10 @@
 import qualified Data.Vector.Storable          as DVS
 import           Data.Word
 import           HaskellWorks.Data.IndexedSeq
+import           HaskellWorks.Data.Snoc
 
 -- | Class of values that support vector like operations
-class IndexedSeq v => VectorLike v where
+class (IndexedSeq v, Snoc v) => VectorLike v where
   vConcat :: [v] -> v
   vFilter :: (Elem v -> Bool) -> v -> v
   vGenerate :: Int -> (Int -> Elem v) -> v
