"run the OS on top of DOS like Windows was previously doing" - you're aware that there were Windows versions between 3.11 and XP, right? None of them ran on top of DOS. Hell, I'll even ignore the fact that the GPP explicitly called out Windows 2000, which (being NT-based) was *exactly* as DOS-based as XP.
The 9x family (95, 98, ME, and their various releases/service packs) booted up through some DOS code, but DOS was basically no more than a bootloader for them. This OS family ran 32-bit protected-mode kernels (DOS was 16-bit Real Mode; no virtual memory, user/kernel separation, or process address space isolation). 9x ran on the FAT filesystem, like DOS, but supported long file names and Unicode, whereas DOS was limited to 8.3 names and 8-bit characters. 9x had a preemptive multitasking scheduler, unlike DOS which had no multitasking support at all (some previous software, such as Windows 1.x-3.x, had a cooperative multitasking scheduler on top of DOS but could not pre-empt a long-running process). 9x could and did run background processes (what a Unix user would call daemons), which was impossible on DOS. 9x had a hardware abstraction layer, allowing processes to share access to hardware such as mice and sound cards without requiring each program to have its own hardware drivers and take total control over the hardware the way DOS programs did.
Claiming that Windows pre-XP ran on top of DOS is just false. It used some DOS code in a few places and used DOS to bootstrap itself, much like a modern bootloader, but that's it. All of the core functions of an OS - the hardware interface, task management, memory management, and file management - were handled by Windows-specific code. The UI was 32-bit and Windows-specific. The 16-bit APIs were still present but the system call interface (kernel32.dll) was 32-bit and Windows-specific. It's true that you couldn't start 9x without DOS, but DOS was not running in any meaningful sense once 9x was.