diff --git a/README.rst b/README.rst
index 41abaa90a8476d456c14d62700536cbeea4b5eb6..fc4d79e1bb280487b0411b45bf51dae9662a6b81 100644
--- a/README.rst
+++ b/README.rst
@@ -1,6 +1,6 @@
 .. -*- mode: rst -*-
 
-|Travis|_ |AppVeyor|_ |Coveralls|_ |CircleCI|_ |Python27|_ |Python35|_ |PyPi|_ |DOI|_
+|Travis|_ |AppVeyor|_ |Codecov|_ |CircleCI|_ |Python27|_ |Python35|_ |PyPi|_ |DOI|_
 
 .. |Travis| image:: https://api.travis-ci.org/scikit-learn/scikit-learn.svg?branch=master
 .. _Travis: https://travis-ci.org/scikit-learn/scikit-learn
@@ -8,8 +8,8 @@
 .. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/github/scikit-learn/scikit-learn?branch=master&svg=true
 .. _AppVeyor: https://ci.appveyor.com/project/sklearn-ci/scikit-learn/history
 
-.. |Coveralls| image:: https://coveralls.io/repos/scikit-learn/scikit-learn/badge.svg?branch=master&service=github
-.. _Coveralls: https://coveralls.io/r/scikit-learn/scikit-learn
+.. |Codecov| image:: https://codecov.io/github/scikit-learn/scikit-learn/badge.svg?branch=master&service=github
+.. _Codecov: https://codecov.io/github/scikit-learn/scikit-learn?branch=master
 
 .. |CircleCI| image:: https://circleci.com/gh/scikit-learn/scikit-learn/tree/master.svg?style=shield&circle-token=:circle-token
 .. _CircleCI: https://circleci.com/gh/scikit-learn/scikit-learn
diff --git a/build_tools/travis/after_success.sh b/build_tools/travis/after_success.sh
index a4613ccc701e0102bff1c5352a4a6df9feb9dea4..aead28cb2865dafec26a914e2a258ecdd50479ba 100755
--- a/build_tools/travis/after_success.sh
+++ b/build_tools/travis/after_success.sh
@@ -7,13 +7,13 @@
 set -e
 
 if [[ "$COVERAGE" == "true" ]]; then
-    # Need to run coveralls from a git checkout, so we copy .coverage
+    # Need to run codecov from a git checkout, so we copy .coverage
     # from TEST_DIR where nosetests has been run
     cp $TEST_DIR/.coverage $TRAVIS_BUILD_DIR
     cd $TRAVIS_BUILD_DIR
-    # Ignore coveralls failures as the coveralls server is not
+    # Ignore codecov failures as the codecov server is not
     # very reliable but we don't want travis to report a failure
     # in the github UI just because the coverage report failed to
     # be published.
-    coveralls || echo "Coveralls upload failed"
+    codecov || echo "codecov upload failed"
 fi
diff --git a/build_tools/travis/install.sh b/build_tools/travis/install.sh
index bc9f13f80d96f9a15d39af8f13cb8e9169eb4f09..85e0d174a18120305f2f67edcd4c0ef20c092ffe 100755
--- a/build_tools/travis/install.sh
+++ b/build_tools/travis/install.sh
@@ -95,7 +95,7 @@ elif [[ "$DISTRIB" == "scipy-dev-wheels" ]]; then
 fi
 
 if [[ "$COVERAGE" == "true" ]]; then
-    pip install coverage coveralls
+    pip install coverage codecov
 fi
 
 if [[ "$SKIP_TESTS" == "true" ]]; then