diff --git a/numpydoc/docscrape.py b/numpydoc/docscrape.py
index 6bdaa84..9496f9d 100644
--- a/numpydoc/docscrape.py
+++ b/numpydoc/docscrape.py
@@ -226,10 +226,14 @@ class NumpyDocString(Mapping):
         params = []
         while not r.eof():
             header = r.read().strip()
-            if " :" in header:
-                arg_name, arg_type = header.split(" :", maxsplit=1)
-                arg_name, arg_type = arg_name.strip(), arg_type.strip()
+            if " : " in header:
+                arg_name, arg_type = header.split(" : ", maxsplit=1)
             else:
+                # NOTE: param line with single element should never have a
+                # a " :" before the description line, so this should probably
+                # warn.
+                if header.endswith(" :"):
+                    header = header[:-2]
                 if single_element_is_type:
                     arg_name, arg_type = "", header
                 else:

diff --git a/numpydoc/tests/test_docscrape.py b/numpydoc/tests/test_docscrape.py
index 55ccf92..049d2a2 100644
--- a/numpydoc/tests/test_docscrape.py
+++ b/numpydoc/tests/test_docscrape.py
@@ -980,6 +980,21 @@ doc8 = NumpyDocString(
 )
 
 
+def test_returns_with_roles_no_names():
+    """Make sure colons that are part of sphinx roles are not misinterpreted
+    as type separator in returns section. See gh-428."""
+    docstring = NumpyDocString(
+        """
+        Returns
+        -------
+        str or :class:`NumpyDocString`
+        """
+    )
+    expected = "str or :class:`NumpyDocString`"  # not "str or : class:...
+    assert docstring["Returns"][0].type == expected
+    assert expected in str(docstring)
+
+
 def test_trailing_colon():
     assert doc8["Parameters"][0].name == "data"
 

Parsing `returns` section with several types and no name
According to numpydoc [return value specification](https://numpydoc.readthedocs.io/en/latest/format.html#returns), the name for each return value may be optional. If the return value is omitted and the return type can take several types (if the actual type depends on user input, for example), then if the second type contains `" :"` as part of the type description (as in the following example) it is incorrectly identified as parameter type separator. This prevents sphinx recognition of the referenced type. 

```python
from numpydoc.docscrape import NumpyDocString
docstr="""
Returns
-------
str or :class:`NumpyDocString`
"""
print(NumpyDocString(docstr))
```
Results with:
```



Returns
-------
str or : class:`NumpyDocString`

```

I would expect getting the following result:
```



Returns
-------
str or :class:`NumpyDocString`

```

The example is using version 1.4.0.
I think this was changed in #286 .

Thanks!
numpydoc/tests/test_docscrape.py::test_returns_with_roles_no_names
numpydoc/tests/test_docscrape.py::test_signature[flush] numpydoc/tests/test_docscrape.py::test_signature[newline_indented] numpydoc/tests/test_docscrape.py::test_summary[flush] numpydoc/tests/test_docscrape.py::test_summary[newline_indented] numpydoc/tests/test_docscrape.py::test_extended_summary[flush] numpydoc/tests/test_docscrape.py::test_extended_summary[newline_indented] numpydoc/tests/test_docscrape.py::test_parameters[flush] numpydoc/tests/test_docscrape.py::test_parameters[newline_indented] numpydoc/tests/test_docscrape.py::test_other_parameters[flush] numpydoc/tests/test_docscrape.py::test_other_parameters[newline_indented] numpydoc/tests/test_docscrape.py::test_returns[flush] numpydoc/tests/test_docscrape.py::test_returns[newline_indented] numpydoc/tests/test_docscrape.py::test_yields numpydoc/tests/test_docscrape.py::test_sent numpydoc/tests/test_docscrape.py::test_returnyield numpydoc/tests/test_docscrape.py::test_section_twice numpydoc/tests/test_docscrape.py::test_notes[flush] numpydoc/tests/test_docscrape.py::test_notes[newline_indented] numpydoc/tests/test_docscrape.py::test_references[flush] numpydoc/tests/test_docscrape.py::test_references[newline_indented] numpydoc/tests/test_docscrape.py::test_examples[flush] numpydoc/tests/test_docscrape.py::test_examples[newline_indented] numpydoc/tests/test_docscrape.py::test_index[flush] numpydoc/tests/test_docscrape.py::test_index[newline_indented] numpydoc/tests/test_docscrape.py::test_str[flush] numpydoc/tests/test_docscrape.py::test_str[newline_indented] numpydoc/tests/test_docscrape.py::test_yield_str numpydoc/tests/test_docscrape.py::test_receives_str numpydoc/tests/test_docscrape.py::test_no_index_in_str numpydoc/tests/test_docscrape.py::test_sphinx_str numpydoc/tests/test_docscrape.py::test_sphinx_yields_str numpydoc/tests/test_docscrape.py::test_parameters_without_extended_description numpydoc/tests/test_docscrape.py::test_escape_stars numpydoc/tests/test_docscrape.py::test_empty_extended_summary numpydoc/tests/test_docscrape.py::test_raises numpydoc/tests/test_docscrape.py::test_warns numpydoc/tests/test_docscrape.py::test_see_also[] numpydoc/tests/test_docscrape.py::test_see_also[\n numpydoc/tests/test_docscrape.py::test_see_also_parse_error numpydoc/tests/test_docscrape.py::test_see_also_print numpydoc/tests/test_docscrape.py::test_see_also_trailing_comma_warning numpydoc/tests/test_docscrape.py::test_unknown_section numpydoc/tests/test_docscrape.py::test_empty_first_line numpydoc/tests/test_docscrape.py::test_trailing_colon numpydoc/tests/test_docscrape.py::test_no_summary numpydoc/tests/test_docscrape.py::test_unicode numpydoc/tests/test_docscrape.py::test_plot_examples numpydoc/tests/test_docscrape.py::test_class_members numpydoc/tests/test_docscrape.py::test_duplicate_signature numpydoc/tests/test_docscrape.py::test_class_members_doc numpydoc/tests/test_docscrape.py::test_class_members_doc_sphinx numpydoc/tests/test_docscrape.py::test_class_attributes_as_member_list numpydoc/tests/test_docscrape.py::test_templated_sections numpydoc/tests/test_docscrape.py::test_nonstandard_property numpydoc/tests/test_docscrape.py::test_args_and_kwargs numpydoc/tests/test_docscrape.py::test_autoclass numpydoc/tests/test_docscrape.py::test_xref numpydoc/tests/test_docscrape.py::test__error_location_no_name_attr