diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,6 +1,10 @@
-## [*Unreleased*](https://github.com/freckle/bcp47/compare/bcp47-v0.2.0.4...main)
+## [*Unreleased*](https://github.com/freckle/bcp47/compare/bcp47-v0.2.0.5...main)
 
 None
+
+## [v0.2.0.5](https://github.com/freckle/bcp47/compare/bcp47-v0.2.0.4...bcp47-v0.2.0.5)
+
+- Fix `Semigroup` instance of `Trie` ([PR #29](https://github.com/freckle/bcp47/pull/29))
 
 ## [v0.2.0.4](https://github.com/freckle/bcp47/compare/bcp47-v0.2.0.3...bcp47-v0.2.0.4)
 
diff --git a/bcp47.cabal b/bcp47.cabal
--- a/bcp47.cabal
+++ b/bcp47.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.12
 name:               bcp47
-version:            0.2.0.4
+version:            0.2.0.5
 license:            MIT
 license-file:       LICENSE
 copyright:          2019 Freckle Education
diff --git a/library/Data/BCP47/Trie/Internal.hs b/library/Data/BCP47/Trie/Internal.hs
--- a/library/Data/BCP47/Trie/Internal.hs
+++ b/library/Data/BCP47/Trie/Internal.hs
@@ -122,4 +122,4 @@
 
 union2Using :: (Maybe a -> Maybe a -> Maybe a) -> Trie2 a -> Trie2 a -> Trie2 a
 union2Using f (Trie2 x xs) (Trie2 y ys) =
-  Trie2 (f x y) (Map.unionWith union2 xs ys)
+  Trie2 (f x y) (Map.unionWith (union2Using f) xs ys)
diff --git a/tests/Data/BCP47/TrieSpec.hs b/tests/Data/BCP47/TrieSpec.hs
--- a/tests/Data/BCP47/TrieSpec.hs
+++ b/tests/Data/BCP47/TrieSpec.hs
@@ -28,6 +28,15 @@
       < singleton es "color"
       `shouldBe` True
 
+    describe "Semigroup instance" $ do
+      it "unions top-level conflicts" $ property $ \l r ->
+        lookup en (singleton en [l] <> singleton en [r])
+          `shouldBe` Just ([l, r] :: [Int])
+
+      it "unions leaf-level conflicts" $ property $ \v1 v2 -> do
+        lookup enGB (singleton enGB [v1] <> singleton enGB [v2])
+          `shouldBe` Just ([v1, v2] :: [Int])
+
     describe "mapMaybe" $ do
       it "Justs are constant" $ property $ \xs ->
         let
