diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+0.0.3
+
+* Add Semigroup and Monoid instance
+
 0.0.2
 
 * Add more optics and functions
diff --git a/polytree.cabal b/polytree.cabal
--- a/polytree.cabal
+++ b/polytree.cabal
@@ -1,5 +1,5 @@
 name:                 polytree
-version:              0.0.2
+version:              0.0.3
 synopsis:             A polymorphic rose-tree
 description:          A rose-tree which has different data in the nodes and leaves
 license:              BSD3
diff --git a/src/Data/PolyTree.hs b/src/Data/PolyTree.hs
--- a/src/Data/PolyTree.hs
+++ b/src/Data/PolyTree.hs
@@ -4,6 +4,7 @@
 
 module Data.PolyTree where
 
+import Control.Applicative
 import Control.Lens
     ( preview,
       iso,
@@ -112,6 +113,38 @@
 instance (Show a, Show1 f, Show b) => Show (Tree f a b) where
   show x =
     liftShowsPrec showsPrec shows 0 x ""
+
+-- |
+--
+-- >>> Leaf "ABC" <> Leaf "DEF" :: Tree1' String
+-- Leaf "ABCDEF"
+--
+-- >>> Leaf "ABC" <> Node "DEF" [] :: Tree0' String
+-- Node "DEF" []
+--
+-- >>> Leaf "ABC" <> Node "DEF" [Leaf "GHI"] :: Tree0' String
+-- Node "DEF" [Leaf "ABCGHI"]
+--
+-- >>> Node "ABC" [] <> Leaf "DEF" :: Tree0' String
+-- Node "ABC" []
+--
+-- >>> Node "ABC" [] <> Node "DEF" [Leaf "GHI"] :: Tree0' String
+-- Node "ABCDEF" []
+--
+-- >>> Node "ABC" [] <> Node "DEF" [Leaf "GHI", Node "JKL" []] :: Tree0' String
+-- Node "ABCDEF" []
+instance (Applicative f, Semigroup a, Semigroup b) => Semigroup (Tree f a b) where
+  Leaf a1 <> Leaf a2 =
+    Leaf (a1 <> a2)
+  Leaf a <> Node b t =
+    Node b (fmap (Leaf a <>) t)
+  Node b t <> Leaf a =
+    Node b (fmap (Leaf a <>) t)
+  Node b1 t1 <> Node b2 t2 =
+    Node (b1 <> b2) (liftA2 (<>) t1 t2)
+
+instance (Applicative f, Monoid a, Monoid b) => Monoid (Tree f a b) where
+  mempty = Leaf mempty
 
 -- |
 --
