diff --git a/CHANGELOG.md b/CHANGELOG.md
index eab52f2..e047a1e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,8 @@
   [#337](https://github.com/lambda-fairy/maud/pull/337)
 - Update to `actix-web` 4.0.
   [#331](https://github.com/lambda-fairy/maud/pull/331)
+- Add a `maud::display` adapter that forwards to the `Display` impl
+  [#350](https://github.com/lambda-fairy/maud/pull/350)
 
 ## [0.23.0] - 2021-11-10
 
diff --git a/maud/src/lib.rs b/maud/src/lib.rs
index 73ac24f..43a82ad 100644
--- a/maud/src/lib.rs
+++ b/maud/src/lib.rs
@@ -12,7 +12,7 @@
 extern crate alloc;
 
 use alloc::{borrow::Cow, boxed::Box, string::String};
-use core::fmt::{self, Arguments, Write};
+use core::fmt::{self, Arguments, Display, Write};
 
 pub use maud_macros::{html, html_debug};
 
@@ -184,6 +184,35 @@ impl_render_with_itoa! {
     u8 u16 u32 u64 u128 usize
 }
 
+/// Renders a value using its [`Display`] impl.
+///
+/// # Example
+///
+/// ```rust
+/// use maud::html;
+/// use std::net::Ipv4Addr;
+///
+/// let ip_address = Ipv4Addr::new(127, 0, 0, 1);
+///
+/// let markup = html! {
+///     "My IP address is: "
+///     (maud::display(ip_address))
+/// };
+///
+/// assert_eq!(markup.into_string(), "My IP address is: 127.0.0.1");
+/// ```
+pub fn display(value: impl Display) -> impl Render {
+    struct DisplayWrapper<T>(T);
+
+    impl<T: Display> Render for DisplayWrapper<T> {
+        fn render_to(&self, w: &mut String) {
+            format_args!("{0}", self.0).render_to(w);
+        }
+    }
+
+    DisplayWrapper(value)
+}
+
 /// A wrapper that renders the inner value without escaping.
 #[derive(Debug, Clone, Copy)]
 pub struct PreEscaped<T: AsRef<str>>(pub T);