diff --git a/Data/List/NonEmpty.hs b/Data/List/NonEmpty.hs
--- a/Data/List/NonEmpty.hs
+++ b/Data/List/NonEmpty.hs
@@ -12,7 +12,6 @@
                            toNonEmpty,
                            unsafeToNonEmpty,
                            (.:),
-                           (.++),
                            -- * List functions
                            reverse,
                            scanl,
@@ -46,6 +45,7 @@
 import Data.Traversable
 import Data.Typeable (Typeable)
 import Data.Data (Data)
+import Data.Semigroup
 import qualified Data.List as L
 import Prelude hiding (foldr, reverse, scanl, scanl1, scanr, scanr1, iterate, repeat, cycle, zip, unzip)
 import Test.QuickCheck hiding (NonEmpty)
@@ -79,6 +79,9 @@
 instance (Show a) => Show (NonEmpty a) where
   show (NonEmpty h t) = '|' : show (h:t) ++ "|"
 
+instance Semigroup (NonEmpty a) where
+  NonEmpty a b .++. NonEmpty c d = NonEmpty a (b ++ c:d)
+
 -- | Constructs a non-empty list with the given head and tail.
 nonEmpty :: a -- ^ The head.
             -> [a] -- ^ The tail.
@@ -109,12 +112,6 @@
         -> NonEmpty a
 a .: NonEmpty h t = NonEmpty a (h:t)
 
--- | Prepends a non-empty list to another non-empty list.
-(.++) :: NonEmpty a -- ^ The non-empty list to prepend.
-         -> NonEmpty a -- ^ The non-empty list to prepend to.
-         -> NonEmpty a
-NonEmpty a b .++ NonEmpty c d = NonEmpty a (b ++ c:d)
-
 -- | Reverses the elements of the (finite) non-empty list.
 reverse :: NonEmpty a
            -> NonEmpty a
@@ -206,7 +203,7 @@
 prop_cons a as = toList (a .: as) == a : toList as
 
 prop_append :: NonEmpty String -> NonEmpty String -> Bool
-prop_append a b = toList (a .++ b) == neHead a : neTail a ++ neHead b : neTail b
+prop_append a b = toList (a .++. b) == neHead a : neTail a ++ neHead b : neTail b
 
 prop_reverse :: NonEmpty String -> Bool
 prop_reverse x = (reverse . reverse) x == x
diff --git a/Data/List/ZipNonEmpty.hs b/Data/List/ZipNonEmpty.hs
--- a/Data/List/ZipNonEmpty.hs
+++ b/Data/List/ZipNonEmpty.hs
@@ -10,7 +10,10 @@
                             ) where
 
 import Data.List
+import Data.Semigroup
 import Data.Foldable
+import Data.Typeable (Typeable)
+import Data.Data (Data)
 import Data.List.NonEmpty
 import Control.Applicative
 
@@ -18,7 +21,7 @@
 newtype ZipNonEmpty a = Z {
   -- | Unwraps a zip-like non-empty list.
   ne :: NonEmpty a
-} deriving (Eq, Ord)
+} deriving (Eq, Ord, Typeable, Data)
 
 -- | Wraps a non-empty list.
 zipNe :: NonEmpty a ->
@@ -41,6 +44,9 @@
 
 instance (Show a) => Show (ZipNonEmpty a) where
   show = show . ne
+
+instance Semigroup (ZipNonEmpty a) where
+  Z a .++. Z b = Z (a .++. b)
 
 instance Functor ZipNonEmpty where
   fmap = usingNe . fmap
diff --git a/NonEmptyList.cabal b/NonEmptyList.cabal
--- a/NonEmptyList.cabal
+++ b/NonEmptyList.cabal
@@ -1,5 +1,5 @@
 Name:                NonEmptyList
-Version:             0.0.5
+Version:             0.0.6
 License:             BSD3
 License-File:        LICENSE
 Synopsis:            A list with a length of at least one.
@@ -17,9 +17,9 @@
 
 Library
   if flag(small_base)
-    Build-Depends: base < 5 && >= 3, QuickCheck >= 2
+    Build-Depends: base < 5 && >= 3, QuickCheck >= 2, Semigroup
   else
-    Build-Depends: base < 5 && >= 3, QuickCheck >= 2
+    Build-Depends: base < 5 && >= 3, QuickCheck >= 2, Semigroup
 
   GHC-Options:    -Wall
   Exposed-Modules: Data.List.NonEmpty
