diff --git a/rose-trees.cabal b/rose-trees.cabal
--- a/rose-trees.cabal
+++ b/rose-trees.cabal
@@ -1,5 +1,5 @@
 Name:                   rose-trees
-Version:                0.0.4
+Version:                0.0.4.1
 Author:                 Athan Clark <athan.clark@gmail.com>
 Maintainer:             Athan Clark <athan.clark@gmail.com>
 License:                BSD3
diff --git a/src/Data/Tree/Hash.hs b/src/Data/Tree/Hash.hs
--- a/src/Data/Tree/Hash.hs
+++ b/src/Data/Tree/Hash.hs
@@ -21,6 +21,8 @@
 import Data.Data
 import GHC.Generics
 import Control.DeepSeq
+import Test.QuickCheck
+import Test.QuickCheck.Instances
 
 
 data HashTree a = HashTree
@@ -34,6 +36,9 @@
 
 instance NFData a => NFData (HashTree a)
 
+instance (Eq a, Hashable a, Arbitrary a) => Arbitrary (HashTree a) where
+  arbitrary = HashTree <$> arbitrary <*> arbitrary
+
 instance Foldable1 HashTree where
   fold1 (HashTree x xs) = F.foldr (\a acc -> sNode a <> acc) x xs
 
@@ -52,6 +57,11 @@
 -- | set-like alias for @isDescendantOf@.
 elem :: Eq a => a -> HashTree a -> Bool
 elem = isDescendantOf
+
+elemPath :: Eq a => [a] -> HashTree a -> Bool
+elemPath [] _ = True
+elemPath (x:xs) (HashTree y ys) =
+  (x == y) && getAny (F.foldMap (Any . elemPath xs) ys)
 
 size :: HashTree a -> Int
 size (HashTree _ xs) = 1 + getSum (F.foldMap (Sum . size) xs)
diff --git a/src/Data/Tree/Knuth.hs b/src/Data/Tree/Knuth.hs
--- a/src/Data/Tree/Knuth.hs
+++ b/src/Data/Tree/Knuth.hs
@@ -82,6 +82,10 @@
 elem :: Eq a => a -> KnuthTree a -> Bool
 elem x (KnuthTree (y,ys)) = x == y || KF.elem x ys
 
+elemPath :: Eq a => [a] -> KnuthTree a -> Bool
+elemPath [] _ = True
+elemPath (x:xs) (KnuthTree (y,ys)) = x == y && KF.elemPath xs ys
+
 isSubtreeOf :: Eq a => KnuthTree a -> KnuthTree a -> Bool
 isSubtreeOf xss yss@(KnuthTree (_,ys)) = xss == yss || go ys
   where
diff --git a/src/Data/Tree/Knuth/Forest.hs b/src/Data/Tree/Knuth/Forest.hs
--- a/src/Data/Tree/Knuth/Forest.hs
+++ b/src/Data/Tree/Knuth/Forest.hs
@@ -123,6 +123,11 @@
 elem _ Nil = False
 elem x (Fork y yc ys) = x == y || elem x ys || elem x yc
 
+elemPath :: Eq a => [a] -> KnuthForest a -> Bool
+elemPath [] _ = True
+elemPath (x:xs) (Fork y yc ys) = (x == y && elemPath xs ys) || elemPath (x:xs) yc
+elemPath _ Nil = False
+
 -- Top-down, breadth-first
 isSubforestOf :: Eq a => KnuthForest a -> KnuthForest a -> Bool
 isSubforestOf Nil _ = True
diff --git a/src/Data/Tree/Rose.hs b/src/Data/Tree/Rose.hs
--- a/src/Data/Tree/Rose.hs
+++ b/src/Data/Tree/Rose.hs
@@ -12,7 +12,9 @@
 import Data.Tree.Knuth
 import Data.Tree.Knuth.Forest as KF
 import Data.Tree.Set
+import Data.Tree.Hash
 import qualified Data.Set as Set
+import qualified Data.HashSet as HS
 
 
 type family Head (x :: *) :: *
@@ -54,3 +56,11 @@
 
 instance RoseTree SetTree where
   (@->) = SetTree
+
+
+-- Data.Tree.Hash
+type instance Head (HashTree a) = a
+type instance Tail (HashTree a) = HS.HashSet (HashTree a)
+
+instance RoseTree HashTree where
+  (@->) = HashTree
diff --git a/src/Data/Tree/Set.hs b/src/Data/Tree/Set.hs
--- a/src/Data/Tree/Set.hs
+++ b/src/Data/Tree/Set.hs
@@ -15,7 +15,6 @@
 import Data.Semigroup
 import Data.Semigroup.Foldable
 import qualified Data.Set.Class as Sets
-import Control.Applicative
 import Control.Monad
 
 import Data.Data
@@ -33,7 +32,7 @@
 instance NFData a => NFData (SetTree a)
 
 instance (Ord a, Arbitrary a) => Arbitrary (SetTree a) where
-  arbitrary = liftA2 SetTree arbitrary arbitrary
+  arbitrary = SetTree <$> arbitrary <*> arbitrary
 
 instance Foldable1 SetTree where
   fold1 (SetTree x xs) = F.foldr (\a acc -> sNode a <> acc) x xs
@@ -53,6 +52,11 @@
 -- | set-like alias for @isDescendantOf@.
 elem :: Eq a => a -> SetTree a -> Bool
 elem = isDescendantOf
+
+elemPath :: Eq a => [a] -> SetTree a -> Bool
+elemPath [] _ = True
+elemPath (x:xs) (SetTree y ys) =
+  (x == y) && getAny (F.foldMap (Any . elemPath xs) ys)
 
 size :: SetTree a -> Int
 size (SetTree _ xs) = 1 + getSum (F.foldMap (Sum . size) xs)
