Holland (8-4) tamed the Tigers on five hits, working around five walks while striking out seven in stretching his unbeaten streak to five starts.
Nelson Cruz keyed the Rangers' offense, going 4-for-5 with an RBI, while Adrian Belte added three hits, including a two-run homer.
Mitch Moreland also went deep with a runner aboard as Texas -- which came into the contest trailing American League West-leading Oakland by a game -- snapped a three-game losing streak.
Scherzer (13-1) absorbed his first loss in the season in his 19th start, allowing four runs on eight hits over six innings.
The defeat left Baltimore's Dave McNally with the best unbeaten pre-All Star Game mark at 13-0, set in 1969.
Hernan Perez drove in the only run for the first-place Tigers, whose AL Central lead over Cleveland shrank to 1 1/2 games with the loss.