diff --git a/doc/source/whatsnew/v0.21.0.txt b/doc/source/whatsnew/v0.21.0.txt
index 015fdf1f45f47..e628578de9894 100644
--- a/doc/source/whatsnew/v0.21.0.txt
+++ b/doc/source/whatsnew/v0.21.0.txt
@@ -178,6 +178,7 @@ Groupby/Resample/Rolling
 Sparse
 ^^^^^^
 
+- Bug in :func:`SparseDataFrame.fillna` not filling all NaNs when frame was instantiated from SciPy sparse matrix (:issue:`16112`)
 
 
 Reshaping
diff --git a/pandas/core/sparse/array.py b/pandas/core/sparse/array.py
index 9025f248e26b6..42fc5189eebd8 100644
--- a/pandas/core/sparse/array.py
+++ b/pandas/core/sparse/array.py
@@ -595,9 +595,8 @@ def fillna(self, value, downcast=None):
         if issubclass(self.dtype.type, np.floating):
             value = float(value)
 
-        new_values = self.sp_values.copy()
-        new_values[isnull(new_values)] = value
-        fill_value = value if isnull(self.fill_value) else self.fill_value
+        new_values = np.where(isnull(self.sp_values), value, self.sp_values)
+        fill_value = value if self._null_fill_value else self.fill_value
 
         return self._simple_new(new_values, self.sp_index,
                                 fill_value=fill_value)
diff --git a/pandas/tests/sparse/test_frame.py b/pandas/tests/sparse/test_frame.py
index 5d75616464fa1..619e646fbfff3 100644
--- a/pandas/tests/sparse/test_frame.py
+++ b/pandas/tests/sparse/test_frame.py
@@ -1252,7 +1252,6 @@ def test_from_scipy_correct_ordering(spmatrix):
     tm.skip_if_no_package('scipy')
 
     arr = np.arange(1, 5).reshape(2, 2)
-
     try:
         spm = spmatrix(arr)
         assert spm.dtype == arr.dtype
@@ -1268,9 +1267,9 @@ def test_from_scipy_correct_ordering(spmatrix):
     tm.assert_frame_equal(sdf.to_dense(), expected.to_dense())
 
 
-def test_from_scipy_object_fillna(spmatrix):
+def test_from_scipy_fillna(spmatrix):
     # GH 16112
-    tm.skip_if_no_package('scipy', max_version='0.19.0')
+    tm.skip_if_no_package('scipy')
 
     arr = np.eye(3)
     arr[1:, 0] = np.nan
@@ -1287,12 +1286,11 @@ def test_from_scipy_object_fillna(spmatrix):
     sdf = pd.SparseDataFrame(spm).fillna(-1.0)
 
     # Returning frame should fill all nan values with -1.0
-    expected = pd.SparseDataFrame({0: {0: 1.0, 1: np.nan, 2: np.nan},
-                                   1: {0: np.nan, 1: 1.0, 2: np.nan},
-                                   2: {0: np.nan, 1: np.nan, 2: 1.0}}
-                                  ).fillna(-1.0)
+    expected = pd.SparseDataFrame([[1, -1, -1],
+                                   [-1, 1, -1],
+                                   [-1, -1, 1.]])
 
-    tm.assert_frame_equal(sdf.to_dense(), expected.to_dense())
+    tm.assert_numpy_array_equal(sdf.values, expected.values)
 
 
 class TestSparseDataFrameArithmetic(object):