diff --git a/nilearn/_utils/class_inspect.py b/nilearn/_utils/class_inspect.py
index 92cb60c407..2b8a570d4a 100644
--- a/nilearn/_utils/class_inspect.py
+++ b/nilearn/_utils/class_inspect.py
@@ -35,6 +35,7 @@
     "check_estimator_sparse_array",
     "check_estimator_sparse_data",
     "check_estimator_sparse_matrix",
+    "check_estimator_sparse_tag",
     "check_f_contiguous_array_estimator",
     "check_fit1d",
     "check_fit2d_1feature",
diff --git a/nilearn/connectome/group_sparse_cov.py b/nilearn/connectome/group_sparse_cov.py
index 3eb496b548..0a2339b12b 100644
--- a/nilearn/connectome/group_sparse_cov.py
+++ b/nilearn/connectome/group_sparse_cov.py
@@ -15,6 +15,7 @@
 from sklearn.base import BaseEstimator
 from sklearn.covariance import empirical_covariance
 from sklearn.model_selection import check_cv
+from sklearn.utils import check_array
 from sklearn.utils.extmath import fast_logdet
 
 from nilearn._utils import CacheMixin, fill_doc, logger
@@ -612,6 +613,9 @@ def fit(
             the object itself. Useful for chaining operations.
 
         """
+        for x in subjects:
+            check_array(x, accept_sparse=False)
+
         if self.memory is None:
             self.memory = Memory(location=None)
 
@@ -1083,6 +1087,9 @@ def fit(
             the object instance itself.
 
         """
+        for x in subjects:
+            check_array(x, accept_sparse=False)
+
         # Empirical covariances
         emp_covs, n_samples = empirical_covariances(
             subjects, assume_centered=False
diff --git a/nilearn/connectome/tests/test_connectivity_matrices.py b/nilearn/connectome/tests/test_connectivity_matrices.py
index f67d8a4852..5a8fa4bd56 100644
--- a/nilearn/connectome/tests/test_connectivity_matrices.py
+++ b/nilearn/connectome/tests/test_connectivity_matrices.py
@@ -57,6 +57,7 @@ def test_check_estimator_cov_estimator(estimator):
     "check_transformers_unfitted",
     "check_fit1d",
     "check_transformer_n_iter",
+    "check_estimator_sparse_tag",
 ]
 
 
diff --git a/nilearn/connectome/tests/test_group_sparse_cov.py b/nilearn/connectome/tests/test_group_sparse_cov.py
index f19e17319f..4a7d28f687 100644
--- a/nilearn/connectome/tests/test_group_sparse_cov.py
+++ b/nilearn/connectome/tests/test_group_sparse_cov.py
@@ -10,10 +10,13 @@
 )
 
 extra_valid_checks = [
-    "check_parameters_default_constructible",
-    "check_no_attributes_set_in_init",
+    "check_complex_data",
+    "check_estimator_sparse_tag",
     "check_estimators_unfitted",
     "check_do_not_raise_errors_in_init_or_set_params",
+    "check_fit1d",
+    "check_no_attributes_set_in_init",
+    "check_parameters_default_constructible",
 ]
 
 
diff --git a/nilearn/decoding/space_net.py b/nilearn/decoding/space_net.py
index 07de66e902..552457feca 100644
--- a/nilearn/decoding/space_net.py
+++ b/nilearn/decoding/space_net.py
@@ -630,6 +630,12 @@ class BaseSpaceNet(CacheMixin, LinearRegression):
     debias : :obj:`bool`, optional (default False)
         If set, then the estimated weights maps will be debiased.
 
+    positive : bool, default=False
+        When set to ``True``, forces the coefficients to be positive.
+        This option is only supported for dense arrays.
+
+        .. versionadded:: 0.11.2dev
+
     Attributes
     ----------
     all_coef_ : ndarray, shape (n_l1_ratios, n_folds, n_features)
@@ -736,6 +742,7 @@ def __init__(
         fit_intercept=True,
         screening_percentile=20.0,
         debias=False,
+        positive=False,
     ):
         self.penalty = penalty
         self.is_classif = is_classif
@@ -762,6 +769,7 @@ def __init__(
         self.target_affine = target_affine
         self.target_shape = target_shape
         self.mask_args = mask_args
+        self.positive = positive
 
         # sanity check on params
         self.check_params()