diff --git a/BUILD.gn b/BUILD.gn
index 04db39a..31ee99b 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -557,7 +557,6 @@
       "api/audio_codecs/test:audio_codecs_api_unittests",
       "api/numerics:numerics_unittests",
       "api/task_queue:pending_task_safety_flag_unittests",
-      "api/task_queue:to_queued_task_unittests",
       "api/transport:stun_unittest",
       "api/video/test:rtc_api_video_unittests",
       "api/video_codecs/test:video_codecs_api_unittests",
diff --git a/api/task_queue/BUILD.gn b/api/task_queue/BUILD.gn
index 62a4a61..8daa01d 100644
--- a/api/task_queue/BUILD.gn
+++ b/api/task_queue/BUILD.gn
@@ -11,7 +11,6 @@
 rtc_library("task_queue") {
   visibility = [ "*" ]
   public = [
-    "queued_task.h",
     "task_queue_base.h",
     "task_queue_factory.h",
   ]
@@ -99,15 +98,6 @@
   }
 }
 
-rtc_source_set("to_queued_task") {
-  visibility = [ "*" ]
-  sources = [ "to_queued_task.h" ]
-  deps = [
-    ":task_queue",
-    "../../api/task_queue:pending_task_safety_flag",
-  ]
-}
-
 rtc_library("pending_task_safety_flag") {
   visibility = [ "*" ]
   sources = [
@@ -135,23 +125,11 @@
     ]
   }
 
-  rtc_library("to_queued_task_unittests") {
-    testonly = true
-    sources = [ "to_queued_task_unittest.cc" ]
-    deps = [
-      ":to_queued_task",
-      "../../api/task_queue",
-      "../../test:test_support",
-    ]
-    absl_deps = [ "//third_party/abseil-cpp/absl/memory" ]
-  }
-
   rtc_library("pending_task_safety_flag_unittests") {
     testonly = true
     sources = [ "pending_task_safety_flag_unittest.cc" ]
     deps = [
       ":pending_task_safety_flag",
-      ":to_queued_task",
       "../../rtc_base:logging",
       "../../rtc_base:rtc_event",
       "../../rtc_base:rtc_task_queue",
diff --git a/api/task_queue/queued_task.h b/api/task_queue/queued_task.h
deleted file mode 100644
index 27a5eda..0000000
--- a/api/task_queue/queued_task.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 2018 The WebRTC Project Authors. All rights reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-#ifndef API_TASK_QUEUE_QUEUED_TASK_H_
-#define API_TASK_QUEUE_QUEUED_TASK_H_
-
-namespace webrtc {
-
-// Base interface for asynchronously executed tasks.
-// The interface basically consists of a single function, Run(), that executes
-// on the target queue.  For more details see the Run() method and TaskQueue.
-class QueuedTask {
- public:
-  virtual ~QueuedTask() = default;
-
-  // Main routine that will run when the task is executed on the desired queue.
-  // The task should return `true` to indicate that it should be deleted or
-  // `false` to indicate that the queue should consider ownership of the task
-  // having been transferred.  Returning `false` can be useful if a task has
-  // re-posted itself to a different queue or is otherwise being re-used.
-  virtual bool Run() = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // API_TASK_QUEUE_QUEUED_TASK_H_
diff --git a/api/task_queue/task_queue_base.cc b/api/task_queue/task_queue_base.cc
index 11231a0..ecdc7f7 100644
--- a/api/task_queue/task_queue_base.cc
+++ b/api/task_queue/task_queue_base.cc
@@ -79,69 +79,3 @@
 #else
 #error Unsupported platform
 #endif
-
-// Functions to support transition from std::unique_ptr<QueuedTask>
-// representation of a task to absl::AnyInvocable<void() &&> representation. In
-// the base interface older and newer functions call each other. This way
-// TaskQueue would work when classes derived from TaskQueueBase implements
-// either old set of Post functions (before the transition) or new set of Post
-// functions. Thus callers of the interface can be updated independently of all
-// of the implementations of that TaskQueueBase interface.
-
-// TODO(bugs.webrtc.org/14245): Delete these functions when transition is
-// complete.
-namespace webrtc {
-namespace {
-class Task : public QueuedTask {
- public:
-  explicit Task(absl::AnyInvocable<void() &&> task) : task_(std::move(task)) {}
-  ~Task() override = default;
-
-  bool Run() override {
-    std::move(task_)();
-    return true;
-  }
-
- private:
-  absl::AnyInvocable<void() &&> task_;
-};
-
-std::unique_ptr<QueuedTask> ToLegacy(absl::AnyInvocable<void() &&> task) {
-  return std::make_unique<Task>(std::move(task));
-}
-
-absl::AnyInvocable<void() &&> FromLegacy(std::unique_ptr<QueuedTask> task) {
-  return [task = std::move(task)]() mutable {
-    if (!task->Run()) {
-      task.release();
-    }
-  };
-}
-
-}  // namespace
-
-void TaskQueueBase::PostTask(std::unique_ptr<QueuedTask> task) {
-  PostTask(FromLegacy(std::move(task)));
-}
-
-void TaskQueueBase::PostTask(absl::AnyInvocable<void() &&> task) {
-  PostTask(ToLegacy(std::move(task)));
-}
-
-void TaskQueueBase::PostDelayedTask(std::unique_ptr<QueuedTask> task,
-                                    uint32_t milliseconds) {
-  PostDelayedTask(FromLegacy(std::move(task)), TimeDelta::Millis(milliseconds));
-}
-
-void TaskQueueBase::PostDelayedTask(absl::AnyInvocable<void() &&> task,
-                                    TimeDelta delay) {
-  PostDelayedTask(ToLegacy(std::move(task)), delay.ms());
-}
-
-void TaskQueueBase::PostDelayedHighPrecisionTask(
-    absl::AnyInvocable<void() &&> task,
-    TimeDelta delay) {
-  PostDelayedHighPrecisionTask(ToLegacy(std::move(task)), delay.ms());
-}
-
-}  // namespace webrtc
diff --git a/api/task_queue/task_queue_base.h b/api/task_queue/task_queue_base.h
index 870637c..a2cff9c 100644
--- a/api/task_queue/task_queue_base.h
+++ b/api/task_queue/task_queue_base.h
@@ -14,7 +14,6 @@
 #include <utility>
 
 #include "absl/functional/any_invocable.h"
-#include "api/task_queue/queued_task.h"
 #include "api/units/time_delta.h"
 #include "rtc_base/system/rtc_export.h"
 #include "rtc_base/thread_annotations.h"
@@ -57,14 +56,7 @@
   // This may vary from one implementation to the next so assumptions about
   // lifetimes of pending tasks should not be made.
   // May be called on any thread or task queue, including this task queue.
-  // TODO(bugs.webrtc.org/14245): Make pure virtual when implemented in all
-  // derived classes.
-  virtual void PostTask(absl::AnyInvocable<void() &&> task);
-
-  // Deprecated, use PostTask variant above in new code.
-  // TODO(bugs.webrtc.org/14245): Delete when all usage is updated to the
-  // function above.
-  virtual void PostTask(std::unique_ptr<QueuedTask> task);
+  virtual void PostTask(absl::AnyInvocable<void() &&> task) = 0;
 
   // Prefer PostDelayedTask() over PostDelayedHighPrecisionTask() whenever
   // possible.
@@ -89,16 +81,8 @@
   // https://crbug.com/webrtc/13583 for more information.
   //
   // May be called on any thread or task queue, including this task queue.
-  // TODO(bugs.webrtc.org/14245): Make pure virtual when implemented in all
-  // derived classes.
   virtual void PostDelayedTask(absl::AnyInvocable<void() &&> task,
-                               TimeDelta delay);
-
-  // Deprecated, use PostDelayedTask variant above in new code.
-  // TODO(bugs.webrtc.org/14245): Delete when all usage is updated to the
-  // function above.
-  virtual void PostDelayedTask(std::unique_ptr<QueuedTask> task,
-                               uint32_t milliseconds);
+                               TimeDelta delay) = 0;
 
   // Prefer PostDelayedTask() over PostDelayedHighPrecisionTask() whenever
   // possible.
@@ -116,18 +100,8 @@
   // battery, when the timer precision can be as poor as 15 ms.
   //
   // May be called on any thread or task queue, including this task queue.
-  // TODO(bugs.webrtc.org/14245): Make pure virtual when implemented in all
-  // derived classes.
   virtual void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task,
-                                            TimeDelta delay);
-
-  // Deprecated, use `PostDelayedHighPrecisionTask` variant above in new code.
-  // TODO(bugs.webrtc.org/14245): Delete when all usage is updated to the
-  // function above.
-  virtual void PostDelayedHighPrecisionTask(std::unique_ptr<QueuedTask> task,
-                                            uint32_t milliseconds) {
-    PostDelayedTask(std::move(task), milliseconds);
-  }
+                                            TimeDelta delay) = 0;
 
   // As specified by `precision`, calls either PostDelayedTask() or
   // PostDelayedHighPrecisionTask().
@@ -144,22 +118,6 @@
     }
   }
 
-  // Deprecated, use `PostDelayedTaskWithPrecision` variant above in new code.
-  // TODO(bugs.webrtc.org/14245): Delete when all usage is updated to the
-  // function above.
-  void PostDelayedTaskWithPrecision(DelayPrecision precision,
-                                    std::unique_ptr<QueuedTask> task,
-                                    uint32_t milliseconds) {
-    switch (precision) {
-      case DelayPrecision::kLow:
-        PostDelayedTask(std::move(task), milliseconds);
-        break;
-      case DelayPrecision::kHigh:
-        PostDelayedHighPrecisionTask(std::move(task), milliseconds);
-        break;
-    }
-  }
-
   // Returns the task queue that is running the current thread.
   // Returns nullptr if this thread is not associated with any task queue.
   // May be called on any thread or task queue, including this task queue.
diff --git a/api/task_queue/to_queued_task.h b/api/task_queue/to_queued_task.h
deleted file mode 100644
index 658eecc..0000000
--- a/api/task_queue/to_queued_task.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright 2019 The WebRTC Project Authors. All rights reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef API_TASK_QUEUE_TO_QUEUED_TASK_H_
-#define API_TASK_QUEUE_TO_QUEUED_TASK_H_
-
-#include <memory>
-#include <type_traits>
-#include <utility>
-
-#include "api/task_queue/pending_task_safety_flag.h"
-#include "api/task_queue/queued_task.h"
-
-namespace webrtc {
-namespace webrtc_new_closure_impl {
-// Simple implementation of QueuedTask for use with lambdas.
-template <typename Closure>
-class ClosureTask : public QueuedTask {
- public:
-  explicit ClosureTask(Closure&& closure)
-      : closure_(std::forward<Closure>(closure)) {}
-
- private:
-  bool Run() override {
-    closure_();
-    return true;
-  }
-
-  typename std::decay<Closure>::type closure_;
-};
-
-template <typename Closure>
-class SafetyClosureTask : public QueuedTask {
- public:
-  explicit SafetyClosureTask(rtc::scoped_refptr<PendingTaskSafetyFlag> safety,
-                             Closure&& closure)
-      : closure_(std::forward<Closure>(closure)),
-        safety_flag_(std::move(safety)) {}
-
- private:
-  bool Run() override {
-    if (safety_flag_->alive())
-      closure_();
-    return true;
-  }
-
-  typename std::decay<Closure>::type closure_;
-  rtc::scoped_refptr<PendingTaskSafetyFlag> safety_flag_;
-};
-
-// Extends ClosureTask to also allow specifying cleanup code.
-// This is useful when using lambdas if guaranteeing cleanup, even if a task
-// was dropped (queue is too full), is required.
-template <typename Closure, typename Cleanup>
-class ClosureTaskWithCleanup : public ClosureTask<Closure> {
- public:
-  ClosureTaskWithCleanup(Closure&& closure, Cleanup&& cleanup)
-      : ClosureTask<Closure>(std::forward<Closure>(closure)),
-        cleanup_(std::forward<Cleanup>(cleanup)) {}
-  ~ClosureTaskWithCleanup() override { cleanup_(); }
-
- private:
-  typename std::decay<Cleanup>::type cleanup_;
-};
-}  // namespace webrtc_new_closure_impl
-
-// Convenience function to construct closures that can be passed directly
-// to methods that support std::unique_ptr<QueuedTask> but not template
-// based parameters.
-template <typename Closure>
-std::unique_ptr<QueuedTask> ToQueuedTask(Closure&& closure) {
-  return std::make_unique<webrtc_new_closure_impl::ClosureTask<Closure>>(
-      std::forward<Closure>(closure));
-}
-
-template <typename Closure>
-std::unique_ptr<QueuedTask> ToQueuedTask(
-    rtc::scoped_refptr<PendingTaskSafetyFlag> safety,
-    Closure&& closure) {
-  return std::make_unique<webrtc_new_closure_impl::SafetyClosureTask<Closure>>(
-      std::move(safety), std::forward<Closure>(closure));
-}
-
-template <typename Closure>
-std::unique_ptr<QueuedTask> ToQueuedTask(const ScopedTaskSafety& safety,
-                                         Closure&& closure) {
-  return ToQueuedTask(safety.flag(), std::forward<Closure>(closure));
-}
-
-template <typename Closure,
-          typename Cleanup,
-          typename std::enable_if<!std::is_same<
-              typename std::remove_const<
-                  typename std::remove_reference<Closure>::type>::type,
-              ScopedTaskSafety>::value>::type* = nullptr>
-std::unique_ptr<QueuedTask> ToQueuedTask(Closure&& closure, Cleanup&& cleanup) {
-  return std::make_unique<
-      webrtc_new_closure_impl::ClosureTaskWithCleanup<Closure, Cleanup>>(
-      std::forward<Closure>(closure), std::forward<Cleanup>(cleanup));
-}
-
-}  // namespace webrtc
-
-#endif  // API_TASK_QUEUE_TO_QUEUED_TASK_H_
diff --git a/api/task_queue/to_queued_task_unittest.cc b/api/task_queue/to_queued_task_unittest.cc
deleted file mode 100644
index aa11041..0000000
--- a/api/task_queue/to_queued_task_unittest.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright 2019 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "api/task_queue/to_queued_task.h"
-
-#include <memory>
-
-#include "absl/memory/memory.h"
-#include "api/task_queue/queued_task.h"
-#include "test/gmock.h"
-#include "test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::InSequence;
-using ::testing::MockFunction;
-
-void RunTask(std::unique_ptr<QueuedTask> task) {
-  // Simulate how task queue suppose to run tasks.
-  QueuedTask* raw = task.release();
-  if (raw->Run())
-    delete raw;
-}
-
-TEST(ToQueuedTaskTest, AcceptsLambda) {
-  bool run = false;
-  std::unique_ptr<QueuedTask> task = ToQueuedTask([&run] { run = true; });
-  EXPECT_FALSE(run);
-  RunTask(std::move(task));
-  EXPECT_TRUE(run);
-}
-
-TEST(ToQueuedTaskTest, AcceptsCopyableClosure) {
-  struct CopyableClosure {
-    CopyableClosure(int* num_copies, int* num_moves, int* num_runs)
-        : num_copies(num_copies), num_moves(num_moves), num_runs(num_runs) {}
-    CopyableClosure(const CopyableClosure& other)
-        : num_copies(other.num_copies),
-          num_moves(other.num_moves),
-          num_runs(other.num_runs) {
-      ++*num_copies;
-    }
-    CopyableClosure(CopyableClosure&& other)
-        : num_copies(other.num_copies),
-          num_moves(other.num_moves),
-          num_runs(other.num_runs) {
-      ++*num_moves;
-    }
-    void operator()() { ++*num_runs; }
-
-    int* num_copies;
-    int* num_moves;
-    int* num_runs;
-  };
-
-  int num_copies = 0;
-  int num_moves = 0;
-  int num_runs = 0;
-
-  std::unique_ptr<QueuedTask> task;
-  {
-    CopyableClosure closure(&num_copies, &num_moves, &num_runs);
-    task = ToQueuedTask(closure);
-    // Destroy closure to check with msan task has own copy.
-  }
-  EXPECT_EQ(num_copies, 1);
-  EXPECT_EQ(num_runs, 0);
-  RunTask(std::move(task));
-  EXPECT_EQ(num_copies, 1);
-  EXPECT_EQ(num_moves, 0);
-  EXPECT_EQ(num_runs, 1);
-}
-
-TEST(ToQueuedTaskTest, AcceptsMoveOnlyClosure) {
-  struct MoveOnlyClosure {
-    MoveOnlyClosure(int* num_moves, std::function<void()> trigger)
-        : num_moves(num_moves), trigger(std::move(trigger)) {}
-    MoveOnlyClosure(const MoveOnlyClosure&) = delete;
-    MoveOnlyClosure(MoveOnlyClosure&& other)
-        : num_moves(other.num_moves), trigger(std::move(other.trigger)) {
-      ++*num_moves;
-    }
-    void operator()() { trigger(); }
-
-    int* num_moves;
-    std::function<void()> trigger;
-  };
-
-  int num_moves = 0;
-  MockFunction<void()> run;
-
-  auto task = ToQueuedTask(MoveOnlyClosure(&num_moves, run.AsStdFunction()));
-  EXPECT_EQ(num_moves, 1);
-  EXPECT_CALL(run, Call);
-  RunTask(std::move(task));
-  EXPECT_EQ(num_moves, 1);
-}
-
-TEST(ToQueuedTaskTest, AcceptsMoveOnlyCleanup) {
-  struct MoveOnlyClosure {
-    MoveOnlyClosure(const MoveOnlyClosure&) = delete;
-    MoveOnlyClosure(MoveOnlyClosure&&) = default;
-    void operator()() { trigger(); }
-
-    std::function<void()> trigger;
-  };
-
-  MockFunction<void()> run;
-  MockFunction<void()> cleanup;
-
-  auto task = ToQueuedTask(MoveOnlyClosure{run.AsStdFunction()},
-                           MoveOnlyClosure{cleanup.AsStdFunction()});
-
-  // Expect run closure to complete before cleanup closure.
-  InSequence in_sequence;
-  EXPECT_CALL(run, Call);
-  EXPECT_CALL(cleanup, Call);
-  RunTask(std::move(task));
-}
-
-TEST(ToQueuedTaskTest, PendingTaskSafetyFlag) {
-  rtc::scoped_refptr<PendingTaskSafetyFlag> flag =
-      PendingTaskSafetyFlag::Create();
-
-  int count = 0;
-  // Create two identical tasks that increment the `count`.
-  auto task1 = ToQueuedTask(flag, [&count]() { ++count; });
-  auto task2 = ToQueuedTask(flag, [&count]() { ++count; });
-
-  EXPECT_EQ(0, count);
-  RunTask(std::move(task1));
-  EXPECT_EQ(1, count);
-  flag->SetNotAlive();
-  // Now task2 should actually not run.
-  RunTask(std::move(task2));
-  EXPECT_EQ(1, count);
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/rtc_base/task_queue.h b/rtc_base/task_queue.h
index d0c0551..0ef0ffe 100644
--- a/rtc_base/task_queue.h
+++ b/rtc_base/task_queue.h
@@ -18,7 +18,6 @@
 
 #include "absl/functional/any_invocable.h"
 #include "absl/memory/memory.h"
-#include "api/task_queue/queued_task.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "rtc_base/system/rtc_export.h"
diff --git a/rtc_base/task_utils/BUILD.gn b/rtc_base/task_utils/BUILD.gn
index fef30eb..1b3a3b5 100644
--- a/rtc_base/task_utils/BUILD.gn
+++ b/rtc_base/task_utils/BUILD.gn
@@ -26,16 +26,6 @@
   absl_deps = [ "//third_party/abseil-cpp/absl/functional:any_invocable" ]
 }
 
-rtc_library("pending_task_safety_flag") {
-  sources = [ "pending_task_safety_flag.h" ]
-  deps = [ "../../api/task_queue:pending_task_safety_flag" ]
-}
-
-rtc_source_set("to_queued_task") {
-  sources = [ "to_queued_task.h" ]
-  deps = [ "../../api/task_queue:to_queued_task" ]
-}
-
 if (rtc_include_tests) {
   rtc_library("repeating_task_unittests") {
     testonly = true
diff --git a/rtc_base/task_utils/pending_task_safety_flag.h b/rtc_base/task_utils/pending_task_safety_flag.h
deleted file mode 100644
index 8321276..0000000
--- a/rtc_base/task_utils/pending_task_safety_flag.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- *  Copyright 2020 The WebRTC Project Authors. All rights reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef RTC_BASE_TASK_UTILS_PENDING_TASK_SAFETY_FLAG_H_
-#define RTC_BASE_TASK_UTILS_PENDING_TASK_SAFETY_FLAG_H_
-
-#include "api/task_queue/pending_task_safety_flag.h"
-
-#endif  // RTC_BASE_TASK_UTILS_PENDING_TASK_SAFETY_FLAG_H_
diff --git a/rtc_base/task_utils/to_queued_task.h b/rtc_base/task_utils/to_queued_task.h
deleted file mode 100644
index 049fb01..0000000
--- a/rtc_base/task_utils/to_queued_task.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- *  Copyright 2019 The WebRTC Project Authors. All rights reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef RTC_BASE_TASK_UTILS_TO_QUEUED_TASK_H_
-#define RTC_BASE_TASK_UTILS_TO_QUEUED_TASK_H_
-
-#include "api/task_queue/to_queued_task.h"
-
-#endif  // RTC_BASE_TASK_UTILS_TO_QUEUED_TASK_H_
