Instantiate an instance (clone) only copies public fields?

I cloned an instance by using Instantiate() and passing the instance, not a prefab, but an instance already in the scene. All public fields were copied but all private or protected fields were reduced to the type default.

I expected an exact copy.

Is this result the expected result or a bug?

I guess I can pass a reference to the original and then reference that, but that is a hack that would only work in rare situations.

As far as I know, a deep copy requires [Serializable], which doesn’t do anything for private variables, so what you describe is what I would expect.