Differentiating is a challenge!
The method of differentiation that I use most often is peer tutoring. Students who finish their practice quicker than others, and whose work is correct, become "my helpers." I pair them up with students I know are struggling in order to provide help. I encourage them to talk with their partner to explain how to solve the problems. I have several students who love to be helpers! They find this process rewarding. (I think it might be appropriate to note that I'm working with ninth graders in a rigorous algebra course. Students who were ahead of the game completed algebra in grade 8. So the span of ability in my classroom doesn't include the advanced or gifted student but it does include some strong math students.)
Sometimes when I know the practice is going to be challenging and having helpers would be beneficial, I challenge my stronger students to do the five "hardest" problems first. If they can do those successfully, then they don't need the whole practice. They will get the added practice on the simpler problems when they are helping others.
My students often ask, "May we work together?" They know they need support and they are comfortable with their classmates being helpers. I find that blending whole group, small group, and individual instruction works well for the group of students I have.
Another method I have used some is tiered assignments. So when I can (and that is not often enough) I try to create more than one practice assignment. If I create a partner activity, stations, or the like, then creating different practice sets works well. One practice set meets the required standard, and the second may have just a bit more challenging practice. Then for students who may still struggle to do the required standard practice, I move about the room to provide support.
My favorite goto website on differentiation is daretodifferentiate. The wiki has background information, professional development materials, and strategies.