diff --git a/benches/waker_fn.rs b/benches/waker_fn.rs
deleted file mode 100644
index 1de1b97..0000000
--- a/benches/waker_fn.rs
+++ /dev/null
@@ -1,89 +0,0 @@
-#![feature(test)]
-
-extern crate test;
-
-use std::cell::RefCell;
-use std::future::Future;
-use std::pin::Pin;
-use std::task::{Context, Poll, Waker};
-
-use crossbeam::sync::Parker;
-use test::Bencher;
-
-/// Runs a future to completion on the current thread.
-fn block_on<F: Future>(future: F) -> F::Output {
-    // Pin the future on the stack.
-    futures::pin_mut!(future);
-
-    thread_local! {
-        // Parker and waker associated with the current thread.
-        static CACHE: RefCell<(Parker, Waker)> = {
-            let parker = Parker::new();
-            let unparker = parker.unparker().clone();
-            let waker = async_task::waker_fn(move || unparker.unpark());
-            RefCell::new((parker, waker))
-        };
-    }
-
-    CACHE.with(|cache| {
-        // Panic if `block_on()` is called recursively.
-        let (parker, waker) = &mut *cache.try_borrow_mut().ok().expect("recursive `block_on`");
-
-        // Create the task context.
-        let cx = &mut Context::from_waker(&waker);
-
-        // Keep polling the future until completion.
-        loop {
-            match future.as_mut().poll(cx) {
-                Poll::Ready(output) => return output,
-                Poll::Pending => parker.park(),
-            }
-        }
-    })
-}
-
-#[bench]
-fn custom_block_on_0_yields(b: &mut Bencher) {
-    b.iter(|| block_on(Yields(0)));
-}
-
-#[bench]
-fn custom_block_on_10_yields(b: &mut Bencher) {
-    b.iter(|| block_on(Yields(10)));
-}
-
-#[bench]
-fn custom_block_on_50_yields(b: &mut Bencher) {
-    b.iter(|| block_on(Yields(50)));
-}
-
-#[bench]
-fn futures_block_on_0_yields(b: &mut Bencher) {
-    b.iter(|| futures::executor::block_on(Yields(0)));
-}
-
-#[bench]
-fn futures_block_on_10_yields(b: &mut Bencher) {
-    b.iter(|| futures::executor::block_on(Yields(10)));
-}
-
-#[bench]
-fn futures_block_on_50_yields(b: &mut Bencher) {
-    b.iter(|| futures::executor::block_on(Yields(50)));
-}
-
-struct Yields(u32);
-
-impl Future for Yields {
-    type Output = ();
-
-    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
-        if self.0 == 0 {
-            Poll::Ready(())
-        } else {
-            self.0 -= 1;
-            cx.waker().wake_by_ref();
-            Poll::Pending
-        }
-    }
-}
diff --git a/src/lib.rs b/src/lib.rs
index 94afa65..9f7ba85 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -90,24 +90,8 @@
 //! The layout of a task is equivalent to 4 `usize`s followed by the schedule function, and then by
 //! a union of the future and its output.
 //!
-//! # Waking
-//!
-//! The handy [`waker_fn`] constructor converts any function into a [`Waker`]. Every time it is
-//! woken, the function gets called:
-//!
-//! ```
-//! let waker = async_task::waker_fn(|| println!("Wake!"));
-//!
-//! // Prints "Wake!" twice.
-//! waker.wake_by_ref();
-//! waker.wake_by_ref();
-//! ```
-//!
-//! This is useful for implementing single-future executors like [`block_on`].
-//!
 //! [`spawn`]: fn.spawn.html
 //! [`spawn_local`]: fn.spawn_local.html
-//! [`waker_fn`]: fn.waker_fn.html
 //! [`Task`]: struct.Task.html
 //! [`JoinHandle`]: struct.JoinHandle.html
 //! [`Waker`]: https://doc.rust-lang.org/std/task/struct.Waker.html
@@ -126,11 +110,9 @@
 mod state;
 mod task;
 mod utils;
-mod waker_fn;
 
 pub use crate::join_handle::JoinHandle;
 pub use crate::task::{spawn, Task};
-pub use crate::waker_fn::waker_fn;
 
 #[cfg(feature = "std")]
 pub use crate::task::spawn_local;
diff --git a/src/task.rs b/src/task.rs
index 6fb4cad..0507a90 100644
--- a/src/task.rs
+++ b/src/task.rs
@@ -61,9 +61,7 @@
         RawTask::<F, R, S>::allocate(future, schedule)
     };
 
-    let task = Task {
-        raw_task,
-    };
+    let task = Task { raw_task };
     let handle = JoinHandle {
         raw_task,
         _marker: PhantomData,
@@ -177,9 +175,7 @@
         RawTask::<_, R, S>::allocate(future, schedule)
     };
 
-    let task = Task {
-        raw_task,
-    };
+    let task = Task { raw_task };
     let handle = JoinHandle {
         raw_task,
         _marker: PhantomData,
diff --git a/src/waker_fn.rs b/src/waker_fn.rs
deleted file mode 100644
index 37105f1..0000000
--- a/src/waker_fn.rs
+++ /dev/null
@@ -1,43 +0,0 @@
-use alloc::sync::Arc;
-use core::mem::{self, ManuallyDrop};
-use core::task::{RawWaker, RawWakerVTable, Waker};
-
-/// Creates a waker from a wake function.
-///
-/// The function gets called every time the waker is woken.
-pub fn waker_fn<F: Fn() + Send + Sync + 'static>(f: F) -> Waker {
-    let raw = Arc::into_raw(Arc::new(f)) as *const ();
-    let vtable = &Helper::<F>::VTABLE;
-    unsafe { Waker::from_raw(RawWaker::new(raw, vtable)) }
-}
-
-struct Helper<F>(F);
-
-impl<F: Fn() + Send + Sync + 'static> Helper<F> {
-    const VTABLE: RawWakerVTable = RawWakerVTable::new(
-        Self::clone_waker,
-        Self::wake,
-        Self::wake_by_ref,
-        Self::drop_waker,
-    );
-
-    unsafe fn clone_waker(ptr: *const ()) -> RawWaker {
-        let arc = ManuallyDrop::new(Arc::from_raw(ptr as *const F));
-        mem::forget(arc.clone());
-        RawWaker::new(ptr, &Self::VTABLE)
-    }
-
-    unsafe fn wake(ptr: *const ()) {
-        let arc = Arc::from_raw(ptr as *const F);
-        (arc)();
-    }
-
-    unsafe fn wake_by_ref(ptr: *const ()) {
-        let arc = ManuallyDrop::new(Arc::from_raw(ptr as *const F));
-        (arc)();
-    }
-
-    unsafe fn drop_waker(ptr: *const ()) {
-        drop(Arc::from_raw(ptr as *const F));
-    }
-}
