diff --git a/conftest.py b/conftest.py
index ea09c62e54c521e4362a6048f462e75b3df25a72..b4775dc47073bc556fe5b46af9c1344a251224b2 100644
--- a/conftest.py
+++ b/conftest.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2020-2022  The Software Heritage developers
+# Copyright (C) 2020-2024  The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -13,8 +13,6 @@ os.environ["LC_ALL"] = "C.UTF-8"
 
 
 @pytest.fixture(autouse=True)
-def tenacity_wait(mocker):
-    # Stops tenacity from blocking lister tests for 50x errors
-    from swh.lister.pattern import Lister
-
-    mocker.patch.object(Lister.http_request.retry, "sleep")
+def mock_sleep(mocker):
+    # Stops tenacity from blocking lister tests when retrying
+    return mocker.patch("time.sleep")
diff --git a/requirements.txt b/requirements.txt
index 6c03204c22421efd21c20c264287cd21cf4c2b32..e8bf14cc263f3d68cd248c94f3f8814306281618 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -10,6 +10,6 @@ python_debian
 repomd
 requests
 setuptools
-tenacity >= 6.2
+tenacity >= 8.4.2
 testing.postgresql
 toml
diff --git a/swh/lister/bitbucket/tests/test_lister.py b/swh/lister/bitbucket/tests/test_lister.py
index 7a78ae258c020d4ae06ca7c01ed46686291662ef..7882d31f30c1aaa69324c26cebd9fb17ee82fbac 100644
--- a/swh/lister/bitbucket/tests/test_lister.py
+++ b/swh/lister/bitbucket/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2017-2023 The Software Heritage developers
+# Copyright (C) 2017-2024 The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -109,8 +109,6 @@ def test_bitbucket_lister_rate_limit_hit(
 
     lister = BitbucketLister(scheduler=swh_scheduler, page_size=10)
 
-    mocker.patch.object(lister.http_request.retry, "sleep")
-
     stats = lister.run()
 
     assert stats.pages == 2
@@ -200,8 +198,6 @@ def test_bitbucket_lister_buggy_page(
 
     lister = BitbucketLister(scheduler=swh_scheduler, page_size=10)
 
-    mocker.patch.object(lister.http_request.retry, "sleep")
-
     stats = lister.run()
 
     assert stats.pages == 2
diff --git a/swh/lister/cgit/tests/test_lister.py b/swh/lister/cgit/tests/test_lister.py
index 44953bb12e3069167aab59c54ae7e3527a0add73..1be417c4747fce81228adf85c58abda53acfa32f 100644
--- a/swh/lister/cgit/tests/test_lister.py
+++ b/swh/lister/cgit/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2019-2023 The Software Heritage developers
+# Copyright (C) 2019-2024 The Software Heritage developers
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
 
@@ -276,8 +276,6 @@ def test_lister_cgit_get_pages_with_pages_and_retry(
 
         lister_cgit = CGitLister(swh_scheduler, url=url)
 
-        mocker.patch.object(lister_cgit.http_request.retry, "sleep")
-
         repos: List[List[str]] = list(lister_cgit.get_pages())
         flattened_repos = sum(repos, [])
         # we should have 16 repos (listed on 3 pages)
diff --git a/swh/lister/gitiles/tests/test_lister.py b/swh/lister/gitiles/tests/test_lister.py
index 2b1211766787f54e5c324595338cbc0ed42537c7..2fb20f50e7c4c45364cb2a83085e57bee3369f87 100644
--- a/swh/lister/gitiles/tests/test_lister.py
+++ b/swh/lister/gitiles/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2023 The Software Heritage developers
+# Copyright (C) 2023-2024 The Software Heritage developers
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
 
@@ -104,7 +104,5 @@ def test_lister_gitiles_get_pages_with_pages_and_retry(
 
         lister_gitiles = GitilesLister(swh_scheduler, url=url)
 
-        mocker.patch.object(lister_gitiles.http_request.retry, "sleep")
-
         pages: List[str] = list(lister_gitiles.get_pages())
         assert len(pages) == 7
diff --git a/swh/lister/gitlab/tests/test_lister.py b/swh/lister/gitlab/tests/test_lister.py
index f8dd50442877574bca6cd4209bc7c90596f95c8d..4cd4b0623272ba476ea2037e717ef879152c3e6b 100644
--- a/swh/lister/gitlab/tests/test_lister.py
+++ b/swh/lister/gitlab/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2017-2022 The Software Heritage developers
+# Copyright (C) 2017-2024 The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -212,7 +212,9 @@ def test_lister_gitlab_incremental(swh_scheduler, requests_mock, datadir):
         assert listed_origin.last_update is not None
 
 
-def test_lister_gitlab_rate_limit(swh_scheduler, requests_mock, datadir, mocker):
+def test_lister_gitlab_rate_limit(
+    swh_scheduler, requests_mock, datadir, mocker, mock_sleep
+):
     """Gitlab lister supports rate-limit"""
     instance = "gite.lirmm.fr"
     url = api_url(instance)
@@ -240,9 +242,6 @@ def test_lister_gitlab_rate_limit(swh_scheduler, requests_mock, datadir, mocker)
         additional_matcher=_match_request,
     )
 
-    # To avoid this test being too slow, we mock sleep within the retry behavior
-    mock_sleep = mocker.patch.object(lister.get_page_result.retry, "sleep")
-
     listed_result = lister.run()
 
     expected_nb_origins = len(response1) + len(response2)
@@ -253,7 +252,7 @@ def test_lister_gitlab_rate_limit(swh_scheduler, requests_mock, datadir, mocker)
 
 @pytest.mark.parametrize("status_code", [502, 503, 520])
 def test_lister_gitlab_http_errors(
-    swh_scheduler, requests_mock, datadir, mocker, status_code
+    swh_scheduler, requests_mock, datadir, mocker, status_code, mock_sleep
 ):
     """Gitlab lister should retry requests when encountering HTTP 50x errors"""
     instance = "gite.lirmm.fr"
@@ -281,9 +280,6 @@ def test_lister_gitlab_http_errors(
         additional_matcher=_match_request,
     )
 
-    # To avoid this test being too slow, we mock sleep within the retry behavior
-    mock_sleep = mocker.patch.object(lister.get_page_result.retry, "sleep")
-
     listed_result = lister.run()
 
     expected_nb_origins = len(response1) + len(response2)
diff --git a/swh/lister/gitweb/tests/test_lister.py b/swh/lister/gitweb/tests/test_lister.py
index 30f3dc916f717632904eb99f27c19364b85be88c..63534215c8f4f6c5ddb3d3c876b89960b752a7f3 100644
--- a/swh/lister/gitweb/tests/test_lister.py
+++ b/swh/lister/gitweb/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2023 The Software Heritage developers
+# Copyright (C) 2023-2024 The Software Heritage developers
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
 
@@ -105,8 +105,6 @@ def test_lister_gitweb_get_pages_with_pages_and_retry(
 
         lister_gitweb = GitwebLister(swh_scheduler, url=url)
 
-        mocker.patch.object(lister_gitweb.http_request.retry, "sleep")
-
         pages: List[List[str]] = list(lister_gitweb.get_pages())
         flattened_repos = sum(pages, [])
         assert len(pages) == 1
diff --git a/swh/lister/golang/tests/test_lister.py b/swh/lister/golang/tests/test_lister.py
index 94cea57f214b7d0f28eb712669e96bfe82b8cca3..a6d24bf26181fc4f9a6ab17deba9f1cdd736a3c3 100644
--- a/swh/lister/golang/tests/test_lister.py
+++ b/swh/lister/golang/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2022-2023  The Software Heritage developers
+# Copyright (C) 2022-2024  The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -97,10 +97,7 @@ def _generate_responses(datadir, requests_mock):
     requests_mock.get(GolangLister.GOLANG_MODULES_INDEX_URL, responses)
 
 
-def test_golang_lister(swh_scheduler, mocker, requests_mock, datadir):
-    # Exponential retries take a long time, so stub time.sleep
-    mocked_sleep = mocker.patch.object(GolangLister.http_request.retry, "sleep")
-
+def test_golang_lister(swh_scheduler, mocker, requests_mock, datadir, mock_sleep):
     # first listing, should return one origin per package
     lister = GolangLister(scheduler=swh_scheduler)
 
@@ -126,7 +123,7 @@ def test_golang_lister(swh_scheduler, mocker, requests_mock, datadir):
 
     # Test `time.sleep` is called with exponential retries
     assert_sleep_calls(
-        mocker, mocked_sleep, [1, WAIT_EXP_BASE, 1, WAIT_EXP_BASE, 1, WAIT_EXP_BASE]
+        mocker, mock_sleep, [1, WAIT_EXP_BASE, 1, WAIT_EXP_BASE, 1, WAIT_EXP_BASE]
     )
 
     # doing it all again (without incremental) should give us the same result
diff --git a/swh/lister/launchpad/tests/test_lister.py b/swh/lister/launchpad/tests/test_lister.py
index d6081bfadd365079e2bfa41265374bc74638af7e..50e0b43c207db86673bdd24d44ea70f18c4da580 100644
--- a/swh/lister/launchpad/tests/test_lister.py
+++ b/swh/lister/launchpad/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2020-2022  The Software Heritage developers
+# Copyright (C) 2020-2024  The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -234,8 +234,6 @@ def test_launchpad_lister_raise_during_listing(
     swh_scheduler, mocker, launchpad_response1, launchpad_bzr_response
 ):
     lister = LaunchpadLister(scheduler=swh_scheduler)
-    # Exponential retries take a long time, so stub time.sleep
-    mocker.patch.object(lister._page_request.retry, "sleep")
 
     mock_getRepositories, mock_getBranches = _mock_launchpad(
         mocker,
diff --git a/swh/lister/maven/tests/test_lister.py b/swh/lister/maven/tests/test_lister.py
index 81a57eeaedd9ac664c734399fdb4889c523dddfb..5f879de85eb5cb174d8513e3ad19778231da0b79 100644
--- a/swh/lister/maven/tests/test_lister.py
+++ b/swh/lister/maven/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2021-2022 The Software Heritage developers
+# Copyright (C) 2021-2024 The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -80,11 +80,6 @@ def network_requests_mock(requests_mock, requests_mock_datadir, maven_index_full
     requests_mock.get(INDEX_URL, content=maven_index_full)
 
 
-@pytest.fixture(autouse=True)
-def retry_sleep_mock(mocker):
-    mocker.patch.object(MavenLister.http_request.retry, "sleep")
-
-
 def test_maven_full_listing(swh_scheduler):
     """Covers full listing of multiple pages, checking page results and listed
     origins, statelessness."""
diff --git a/swh/lister/npm/tests/test_lister.py b/swh/lister/npm/tests/test_lister.py
index 7c4fa9346a2aa1654470f153b994f331b7a3715c..ea27778f15f9aae1b45813ee6b7207ad514edfc0 100644
--- a/swh/lister/npm/tests/test_lister.py
+++ b/swh/lister/npm/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2018-2022 The Software Heritage developers
+# Copyright (C) 2018-2024 The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -35,11 +35,6 @@ def npm_incremental_listing_page2(datadir):
     return json.loads(Path(datadir, "npm_incremental_page2.json").read_text())
 
 
-@pytest.fixture(autouse=True)
-def retry_sleep_mock(mocker):
-    mocker.patch.object(NpmLister.http_request.retry, "sleep")
-
-
 def _check_listed_npm_packages(lister, packages, scheduler_origins):
     for package in packages:
         package_name = package["doc"]["name"]
diff --git a/swh/lister/phabricator/tests/test_lister.py b/swh/lister/phabricator/tests/test_lister.py
index acea2b7af00fe4ad6f0525fd1446a6d07c01a861..3b10bc091c88408443b4cf19ab082e1a1ef04a33 100644
--- a/swh/lister/phabricator/tests/test_lister.py
+++ b/swh/lister/phabricator/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2019-2022  The Software Heritage developers
+# Copyright (C) 2019-2024  The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -27,11 +27,6 @@ def phabricator_repositories_page2(datadir):
     )
 
 
-@pytest.fixture(autouse=True)
-def retry_sleep_mock(mocker):
-    mocker.patch.object(PhabricatorLister.http_request.retry, "sleep")
-
-
 def test_get_repo_url(phabricator_repositories_page1):
     repos = phabricator_repositories_page1["result"]["data"]
     for repo in repos:
diff --git a/swh/lister/sourceforge/tests/test_lister.py b/swh/lister/sourceforge/tests/test_lister.py
index 4261ce5e7df2dd77b8cbf5b9d6cc8de774cd72d5..a7b767e7a29daf089e4bb004d974eb726b3d2fd4 100644
--- a/swh/lister/sourceforge/tests/test_lister.py
+++ b/swh/lister/sourceforge/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2021-2023 The Software Heritage developers
+# Copyright (C) 2021-2024 The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -367,12 +367,11 @@ def test_sourceforge_lister_incremental(swh_scheduler, requests_mock, datadir, m
     _check_listed_origins(lister, swh_scheduler)
 
 
-def test_sourceforge_lister_retry(swh_scheduler, requests_mock, mocker, datadir):
+def test_sourceforge_lister_retry(
+    swh_scheduler, requests_mock, mocker, datadir, mock_sleep
+):
     lister = SourceForgeLister(scheduler=swh_scheduler)
 
-    # Exponential retries take a long time, so stub time.sleep
-    mocked_sleep = mocker.patch.object(lister.http_request.retry, "sleep")
-
     requests_mock.get(
         MAIN_SITEMAP_URL,
         [
@@ -431,18 +430,15 @@ def test_sourceforge_lister_retry(swh_scheduler, requests_mock, mocker, datadir)
     _check_listed_origins(lister, swh_scheduler)
 
     # Test `time.sleep` is called with exponential retries
-    assert_sleep_calls(mocker, mocked_sleep, [1, WAIT_EXP_BASE, 1, 1])
+    assert_sleep_calls(mocker, mock_sleep, [1, WAIT_EXP_BASE, 1, 1])
 
 
 @pytest.mark.parametrize("status_code", [500, 503, 504, 403, 404])
 def test_sourceforge_lister_http_error(
-    swh_scheduler, requests_mock, status_code, mocker
+    swh_scheduler, requests_mock, status_code, mocker, mock_sleep
 ):
     lister = SourceForgeLister(scheduler=swh_scheduler)
 
-    # Exponential retries take a long time, so stub time.sleep
-    mocked_sleep = mocker.patch.object(lister.http_request.retry, "sleep")
-
     requests_mock.get(MAIN_SITEMAP_URL, status_code=status_code)
 
     with pytest.raises(HTTPError):
@@ -452,7 +448,7 @@ def test_sourceforge_lister_http_error(
     if status_code >= 500:
         exp_retries = [1.0, 10.0, 100.0, 1000.0]
 
-    assert_sleep_calls(mocker, mocked_sleep, exp_retries)
+    assert_sleep_calls(mocker, mock_sleep, exp_retries)
 
 
 @pytest.mark.parametrize("status_code", [500, 503, 504, 403, 404])
@@ -460,8 +456,6 @@ def test_sourceforge_lister_project_error(
     datadir, swh_scheduler, requests_mock, status_code, mocker
 ):
     lister = SourceForgeLister(scheduler=swh_scheduler)
-    # Exponential retries take a long time, so stub time.sleep
-    mocker.patch.object(lister.http_request.retry, "sleep")
 
     requests_mock.get(
         MAIN_SITEMAP_URL,
diff --git a/swh/lister/stagit/tests/test_lister.py b/swh/lister/stagit/tests/test_lister.py
index 15fbdcb12b6a0354fbafa6f77a87fd22cd23f143..dc810a0a83b874a05dd849679037d9ff5d9773e9 100644
--- a/swh/lister/stagit/tests/test_lister.py
+++ b/swh/lister/stagit/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2023 The Software Heritage developers
+# Copyright (C) 2023-2024 The Software Heritage developers
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
 
@@ -97,8 +97,6 @@ def test_lister_stagit_get_pages_with_pages_and_retry(
 
         lister_stagit = StagitLister(swh_scheduler, url=url)
 
-        mocker.patch.object(lister_stagit.http_request.retry, "sleep")
-
         pages: List[List[str]] = list(lister_stagit.get_pages())
         flattened_repos = sum(pages, [])
         assert len(pages) == 1
diff --git a/swh/lister/tuleap/tests/test_lister.py b/swh/lister/tuleap/tests/test_lister.py
index 722e70810f4fc20fabbf0003eeb884243bd26e2e..019494100d26196a38c68ee2d5d706b91138ae3b 100644
--- a/swh/lister/tuleap/tests/test_lister.py
+++ b/swh/lister/tuleap/tests/test_lister.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2021-2022 The Software Heritage developers
+# Copyright (C) 2021-2024 The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
@@ -92,11 +92,6 @@ def tuleap_repo_3(datadir) -> Tuple[str, Dict[str, str], List[RepoPage], List[st
     return text, headers, page_results, origin_urls
 
 
-@pytest.fixture(autouse=True)
-def retry_sleep_mock(mocker):
-    mocker.patch.object(TuleapLister.http_request.retry, "sleep")
-
-
 def check_listed_origins(lister_urls: List[str], scheduler_origins: List[ListedOrigin]):
     """Asserts that the two collections have the same origin URLs.