diff --git a/Cargo.toml b/Cargo.toml
index 2659c95..a679840 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -96,9 +96,6 @@ replace = """
 [Unreleased]: https://github.com/assert-rs/predicates-rs/compare/{{tag_name}}...HEAD"""
 search = "<!-- next-url -->"
 
-[dependencies.anstyle]
-version = "1.0.0"
-
 [dependencies.difflib]
 version = "0.4"
 optional = true
@@ -121,6 +118,9 @@ version = "1.0"
 version = "1.0"
 optional = true
 
+[dependencies.termcolor]
+version = "1.2.0"
+
 [dev-dependencies.predicates-tree]
 version = "1.0"
 
diff --git a/src/color.rs b/src/color.rs
index f1b6a21..2b9449c 100644
--- a/src/color.rs
+++ b/src/color.rs
@@ -1,17 +1,29 @@
-#[derive(Copy, Clone, Debug, Default)]
+use std::io::Write;
+use termcolor::{Color, ColorSpec, WriteColor};
+
+#[derive(Clone, Debug, Default)]
 pub(crate) struct Palette {
-    description: anstyle::Style,
-    var: anstyle::Style,
-    expected: anstyle::Style,
+    description: ColorSpec,
+    var: ColorSpec,
+    expected: ColorSpec,
 }
 
 impl Palette {
     pub(crate) fn new(alternate: bool) -> Self {
         if alternate && cfg!(feature = "color") {
             Self {
-                description: anstyle::AnsiColor::Blue.on_default() | anstyle::Effects::BOLD,
-                var: anstyle::AnsiColor::Red.on_default() | anstyle::Effects::BOLD,
-                expected: anstyle::AnsiColor::Green.on_default() | anstyle::Effects::BOLD,
+                description: ColorSpec::new()
+                    .set_fg(Some(Color::Blue))
+                    .set_bold(true)
+                    .clone(),
+                var: ColorSpec::new()
+                    .set_fg(Some(Color::Red))
+                    .set_bold(true)
+                    .clone(),
+                expected: ColorSpec::new()
+                    .set_fg(Some(Color::Green))
+                    .set_bold(true)
+                    .clone(),
             }
         } else {
             Self::plain()
@@ -26,27 +38,27 @@ impl Palette {
         }
     }
 
-    pub(crate) fn description<D: std::fmt::Display>(self, display: D) -> Styled<D> {
-        Styled::new(display, self.description)
+    pub(crate) fn description<D: std::fmt::Display>(&self, display: D) -> Styled<D> {
+        Styled::new(display, self.description.clone())
     }
 
-    pub(crate) fn var<D: std::fmt::Display>(self, display: D) -> Styled<D> {
-        Styled::new(display, self.var)
+    pub(crate) fn var<D: std::fmt::Display>(&self, display: D) -> Styled<D> {
+        Styled::new(display, self.var.clone())
     }
 
-    pub(crate) fn expected<D: std::fmt::Display>(self, display: D) -> Styled<D> {
-        Styled::new(display, self.expected)
+    pub(crate) fn expected<D: std::fmt::Display>(&self, display: D) -> Styled<D> {
+        Styled::new(display, self.expected.clone())
     }
 }
 
 #[derive(Debug)]
 pub(crate) struct Styled<D> {
     display: D,
-    style: anstyle::Style,
+    style: ColorSpec,
 }
 
 impl<D: std::fmt::Display> Styled<D> {
-    pub(crate) fn new(display: D, style: anstyle::Style) -> Self {
+    pub(crate) fn new(display: D, style: ColorSpec) -> Self {
         Self { display, style }
     }
 }
@@ -55,10 +67,11 @@ impl<D: std::fmt::Display> std::fmt::Display for Styled<D> {
     #[inline]
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         if f.alternate() {
-            write!(f, "{}", self.style.render())?;
-            self.display.fmt(f)?;
-            write!(f, "{}", self.style.render_reset())?;
-            Ok(())
+            let mut buf = termcolor::Buffer::ansi();
+            buf.set_color(&self.style).unwrap();
+            write!(&mut buf, "{}", &self.display).unwrap();
+            buf.reset().unwrap();
+            write!(f, "{}", String::from_utf8(buf.into_inner()).unwrap())
         } else {
             self.display.fmt(f)
         }
