An agreement was reached Friday, and the deal was announced Monday night.
Infante, who turns 32 on Dec. 26, should stabilize second base after the Royals churned through six players last season. None of them did enough to earn the job.
Infante hit .318 with 10 homers and 51 RBIs in 118 games for Detroit last season.
He received substantial interest from the New York Yankees, who were seeking a replacement for Robinson Cano. But the Yankees were hesitant to give Infante more than three years, and the Royals gave the versatile infielder an extra year.