diff --git a/src/rangedict.rs b/src/rangedict.rs
index bb09282d037f9721bf613f212c0f3addbad2bb53..5e83df327498a8637b4ac155759f91a32b867212 100644
--- a/src/rangedict.rs
+++ b/src/rangedict.rs
@@ -3,7 +3,7 @@ use std::collections::BTreeMap;
 use thiserror::Error;
 
 /// Error type for [`RangeDict`]
-#[derive(Error, Debug, PartialEq)]
+#[derive(Clone, Error, Debug, PartialEq)]
 pub enum RangeDictError {
     /// Used when an invalid range is provided (e.g. End is before start).
     #[error("Invalid range provided")]
@@ -20,7 +20,7 @@ pub enum RangeDictError {
 /// Powereded by a BTreeMap under the hood.
 ///
 /// Note: Ranges are inclusive.
-#[derive(Debug)]
+#[derive(Clone, Debug)]
 pub struct RangeDict<RK: Ord + Copy, V> {
     ranges: BTreeMap<RK, (RK, V)>, // Key: start of range, Value: (end, associated value)
 }
diff --git a/src/rangeset.rs b/src/rangeset.rs
index 2c5429170fb1a202d9ac10a2de9ccaf0974c3c67..af804ff808bfb268412b564e563c607feb42c8f8 100644
--- a/src/rangeset.rs
+++ b/src/rangeset.rs
@@ -3,7 +3,7 @@ use std::collections::BTreeMap;
 use thiserror::Error;
 
 /// Error type for [`RangeSet`]
-#[derive(Error, Debug, PartialEq)]
+#[derive(Clone, Error, Debug, PartialEq)]
 pub enum RangeSetError {
     /// Used when an invalid range is provided (e.g. End is before start).
     #[error("Invalid range provided")]
@@ -14,7 +14,7 @@ pub enum RangeSetError {
 }
 
 /// A set of non-overlapping ranges.
-#[derive(Debug)]
+#[derive(Clone, Debug)]
 pub struct RangeSet<RK: Ord + Copy> {
     ranges: BTreeMap<RK, RK>, // Maps start -> end
 }