A virtual machine (VM) is a software abstraction of a real, physical machine. Virtualization has been around for almost 50 years, beginning with IBM's pioneering work in the 1960s. However, recent years have seen a significant surge in the interest and use of virtualization, driven by better hardware support, increasing power costs and low resource utilizations. Server consolidation is by far the most common application for virtualization -- by aggregating multiple services on a single physical machine, organizations can reduce costs and increase the utilization of their infrastructure. While server consolidation remains a powerful driving force, virtualization is now becoming even more compelling for the innovative applications it enables, such as to support legacy software, for disaster recovery and backup, and for intrusion detection and malware analysis, to name a few. The key premise of this dissertation is that the ability to efficiently multiplex virtual machines is critical to realizing the benefits of virtualization, not just for existing applications such as server consolidation, but also in enabling some fundamentally new applications. An inevitable consequence of conventional mechanisms for multiplexing is resource partitioning: individual VMs can only use a fraction of the actual physical resources. This partitioning limits not only the resources available for a single VM, but also the total number of VMs that the hardware can support. Here we hit a fundamental barrier -- the aggregate resources available to the VMs are bounded by the capacity of the underlying hardware. This dissertation describes mechanisms to work around this barrier to increase the perceived resource capacity of individual VMs, as well as to increase the total number of VMs that can be created. First, we present "time dilation, " a technique that allows the perceived aggregate capacity of the VMs to exceed the capacity of the underlying hardware. Time dilation also enables many interesting experiments, such as predicting application behavior and protocol performance in resource-rich environments. Next, we use time dilation to build a framework and methodology called DieCast for accurate testing of large systems using a much smaller infrastructure. Finally, we present Difference Engine, a system that exploits fine-grained similarities in memory among VMs to extract twice as much memory savings as the current state of the art, thus freeing memory for additional VMs. Together, our contributions make significant advances in making virtual machine multiplexing more scalable