A common pattern is to export items from private modules in some public module (often the top level of a crate), in order to present a simpler module structure to external users.
But then inside the crate you have two ways to reference the item. Would use use the items from the private modules, or use them from the top-level module?
It would be nice to have a way to export things externally in a way that is not visible internally. I guess it can be achieved with a separate crate that just re-exports things from an implementation crate.
And in some cases, module privacy makes this the only choice. For example, in Tokio, the "real" path of tokio::sync::Semaphore is tokio::sync::semaphore::Semaphore. And because semaphore is a private module of tokio::sync, the tokio::io module is not able to use the tokio::sync::semaphore::Semaphore path and must use the tokio::sync::Semaphore.