diff --git a/doc/whats_new.rst b/doc/whats_new.rst
index 34f82c30e981e4b4a17ebf3908b2f4e06703a17e..a0e2509957b3ede08265d9de20f9c2f3a11915d0 100644
--- a/doc/whats_new.rst
+++ b/doc/whats_new.rst
@@ -140,6 +140,10 @@ Enhancements
 Bug fixes
 .........
 
+   - Fixed a bug where :func:`sklearn.datasets.make_moons` gives an
+     incorrect result when ``n_samples`` is odd.
+     :issue:`8198` by :user:`Josh Levy <levy5674>`.
+
    - Fixed a bug where :class:`sklearn.linear_model.LassoLars` does not give
      the same result as the LassoLars implementation available
      in R (lars library). :issue:`7849` by :user:`Jair Montoya Martinez <jmontoyam>`
diff --git a/sklearn/datasets/samples_generator.py b/sklearn/datasets/samples_generator.py
index 8321159c35ed1534fafca84a9863cf615faa777b..e7f61b3227331b396bafb13ffeddd3cad5960673 100644
--- a/sklearn/datasets/samples_generator.py
+++ b/sklearn/datasets/samples_generator.py
@@ -665,8 +665,8 @@ def make_moons(n_samples=100, shuffle=True, noise=None, random_state=None):
 
     X = np.vstack((np.append(outer_circ_x, inner_circ_x),
                    np.append(outer_circ_y, inner_circ_y))).T
-    y = np.hstack([np.zeros(n_samples_in, dtype=np.intp),
-                   np.ones(n_samples_out, dtype=np.intp)])
+    y = np.hstack([np.zeros(n_samples_out, dtype=np.intp),
+                   np.ones(n_samples_in, dtype=np.intp)])
 
     if shuffle:
         X, y = util_shuffle(X, y, random_state=generator)
diff --git a/sklearn/datasets/tests/test_samples_generator.py b/sklearn/datasets/tests/test_samples_generator.py
index 324df959bd0744b641362193b3a0547b586de7aa..cd4d4148c07cc2ea5367f7446e69b4658ac1743b 100644
--- a/sklearn/datasets/tests/test_samples_generator.py
+++ b/sklearn/datasets/tests/test_samples_generator.py
@@ -24,6 +24,7 @@ from sklearn.datasets import make_friedman1
 from sklearn.datasets import make_friedman2
 from sklearn.datasets import make_friedman3
 from sklearn.datasets import make_low_rank_matrix
+from sklearn.datasets import make_moons
 from sklearn.datasets import make_sparse_coded_signal
 from sklearn.datasets import make_sparse_uncorrelated
 from sklearn.datasets import make_spd_matrix
@@ -360,3 +361,12 @@ def test_make_checkerboard():
     X2, _, _ = make_checkerboard(shape=(100, 100), n_clusters=2,
                                  shuffle=True, random_state=0)
     assert_array_equal(X1, X2)
+
+
+def test_make_moons():
+    X, y = make_moons(3, shuffle=False)
+    for x, label in zip(X, y):
+        center = [0.0, 0.0] if label == 0 else [1.0, 0.5]
+        dist_sqr = ((x - center) ** 2).sum()
+        assert_almost_equal(dist_sqr, 1.0,
+                            err_msg="Point is not on expected unit circle")