diff --git a/CHANGES.rst b/CHANGES.rst
index aa03e44b11849d57f17b80f505c4288986fb8506..6b2b929533c6ec74d5927aef79de838fc6a4c83f 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -8,21 +8,21 @@ Cython Changelog
 Features added
 --------------
 
-* Extension module initialisation follows PEP 489 in CPython 3.5+, which resolves
-  several differences with regard to normal Python modules.  This makes the global
-  names ``__file__`` and ``__path__`` correctly available to module level code and
-  improves the support for module-level relative imports.
-  https://www.python.org/dev/peps/pep-0489/
+* Extension module initialisation follows
+  `PEP 489 <https://www.python.org/dev/peps/pep-0489/>`_ in CPython 3.5+, which
+  resolves several differences with regard to normal Python modules.  This makes
+  the global names ``__file__`` and ``__path__`` correctly available to module
+  level code and improves the support for module-level relative imports.
   (Github issues #1715, #1753)
 
-* Asynchronous generators (PEP 525) and asynchronous comprehensions (PEP 530)
+* Asynchronous generators (`PEP 525 <https://www.python.org/dev/peps/pep-0525/>`_)
+  and asynchronous comprehensions (`PEP 530 <https://www.python.org/dev/peps/pep-0530/>`_)
   have been implemented.  Note that async generators require finalisation support
   in order to allow for asynchronous operations during cleanup, which is only
   available in CPython 3.6+.  All other functionality has been backported as usual.
-  https://www.python.org/dev/peps/pep-0525/
-  https://www.python.org/dev/peps/pep-0530/
 
-* Variable annotations are now parsed according to PEP 526.  Cython types (e.g.
+* Variable annotations are now parsed according to
+  `PEP 526 <https://www.python.org/dev/peps/pep-0526/>`_.  Cython types (e.g.
   ``cython.int``) are evaluated as C type declarations and everything else as Python
   types.  This can be disabled with the directive ``annotation_typing=False``.
   (Github issue #1850)
@@ -67,10 +67,12 @@ Bugs fixed
 Other changes
 -------------
 
-* Type declarations in signature annotations are now parsed according to PEP 484
+* Type declarations in signature annotations are now parsed according to
+  `PEP 484 <https://www.python.org/dev/peps/pep-0484/>`_
   typing.  Only Cython types (e.g. ``cython.int``) and Python builtin types are
   currently considered as type declarations.  Everything else is ignored, but this
-  will probably change in a future Cython release.  (Github issue #1672)
+  will probably change in a future Cython release.
+  (Github issue #1672)
 
 * The directive ``annotation_typing`` is now ``True`` by default, which enables
   parsing type declarations from annotations.
@@ -326,7 +328,7 @@ Bugs fixed
 * IPython cell magic was lacking a good way to enable Python 3 code semantics.
   It can now be used as "%%cython -3".
 
-* Follow a recent change in `PEP 492 <https://www.python.org/dev/peps/pep-0498/>`_
+* Follow a recent change in `PEP 492 <https://www.python.org/dev/peps/pep-0492/>`_
   and CPython 3.5.2 that now requires the ``__aiter__()`` method of asynchronous
   iterators to be a simple ``def`` method instead of an ``async def`` method.
 
@@ -356,12 +358,12 @@ Bugs fixed
 Features added
 --------------
 
-* PEP 498: Literal String Formatting (f-strings).
+* `PEP 498 <https://www.python.org/dev/peps/pep-0498/>`_:
+  Literal String Formatting (f-strings).
   Original patch by Jelle Zijlstra.
-  https://www.python.org/dev/peps/pep-0498/
 
-* PEP 515: Underscores as visual separators in number literals.
-  https://www.python.org/dev/peps/pep-0515/
+* `PEP 515 <https://www.python.org/dev/peps/pep-0515/>`_:
+  Underscores as visual separators in number literals.
 
 * Parser was adapted to some minor syntax changes in Py3.6, e.g.
   https://bugs.python.org/issue9232
@@ -544,11 +546,11 @@ Bugs fixed
 Features added
 --------------
 
-* PEP 492 (async/await) was implemented.
-  See https://www.python.org/dev/peps/pep-0492/
+* `PEP 492 <https://www.python.org/dev/peps/pep-0492/>`_
+  (async/await) was implemented.
 
-* PEP 448 (Additional Unpacking Generalizations) was implemented.
-  See https://www.python.org/dev/peps/pep-0448/
+* `PEP 448 <https://www.python.org/dev/peps/pep-0448/>`_
+  (Additional Unpacking Generalizations) was implemented.
 
 * Support for coverage.py 4.0+ can be enabled by adding the plugin
   "Cython.Coverage" to the ".coveragerc" config file.
@@ -739,9 +741,9 @@ Features added
 
 * Anonymous C tuple types can be declared as (ctype1, ctype2, ...).
 
-* PEP 479: turn accidental StopIteration exceptions that exit generators
+* `PEP 479 <https://www.python.org/dev/peps/pep-0479/>`_:
+  turn accidental StopIteration exceptions that exit generators
   into a RuntimeError, activated with future import "generator_stop".
-  See https://www.python.org/dev/peps/pep-0479/
 
 * Looping over ``reversed(range())`` is optimised in the same way as
   ``range()``.  Patch by Favian Contreras.