diff --git a/changelogs/unreleased/47765-group-visibility-error-due-to-string-conversion.yml b/changelogs/unreleased/47765-group-visibility-error-due-to-string-conversion.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ad09527b3296ca5c75164ca5228d42da24d6838f
--- /dev/null
+++ b/changelogs/unreleased/47765-group-visibility-error-due-to-string-conversion.yml
@@ -0,0 +1,6 @@
+---
+title: Importing a project no longer fails when visibility level holds a string value
+  type
+merge_request: 21242
+author:
+type: fixed
diff --git a/lib/gitlab/import_export/project_tree_restorer.rb b/lib/gitlab/import_export/project_tree_restorer.rb
index 76b99b1de162ed41886a90720b520f77f269a50d..f4106e03a573c6415a77f17ec5ae17f97ea9ae8d 100644
--- a/lib/gitlab/import_export/project_tree_restorer.rb
+++ b/lib/gitlab/import_export/project_tree_restorer.rb
@@ -94,7 +94,10 @@ def default_relation_list
       end
 
       def restore_project
-        @project.update_columns(project_params)
+        Gitlab::Timeless.timeless(@project) do
+          @project.update(project_params)
+        end
+
         @project
       end
 
diff --git a/spec/lib/gitlab/import_export/importer_spec.rb b/spec/lib/gitlab/import_export/importer_spec.rb
index f07946824c48e6f94f0eaecce185489616811886..8053c48ad6c619abe7f7687970ee3c5c1c4158bb 100644
--- a/spec/lib/gitlab/import_export/importer_spec.rb
+++ b/spec/lib/gitlab/import_export/importer_spec.rb
@@ -63,6 +63,16 @@
 
         importer.execute
       end
+
+      it 'sets the correct visibility_level when visibility level is a string' do
+        project.create_or_update_import_data(
+          data: { override_params: { visibility_level: Gitlab::VisibilityLevel::PRIVATE.to_s } }
+        )
+
+        importer.execute
+
+        expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
+      end
     end
 
     context 'when project successfully restored' do