I've been around the block. I get the same questions from people over and over. I hope to answer the common ones here, and provide some of my advice.
Please keep in mind this advice comes from a mechanical engineering perspective, this advice might not always be helpful. A couple steps can drastically improve your rate of interviewing and your rate of offers.
1. Don't bother with cover letters
Try uploading a blank page instead.
2. Include a portfolio of your work
The number one way you can increase your chances of getting an internship, especially for hardware (mechanical and electrical). Show off all your previous work, make sure to include images, and not just renders - show what you built in real life. That last part is important, prototyping and building things with your hands is required for a ton of jobs. Make sure to include this in all your applications.
3. Start high, end low
For your first internship you should be applying to 100+ positions, especially if you don't have much experience. For every subsequent internship you should halve that number. Make sure that for your first internship you apply to as many jobs as possible, as many that you could actually picture yourself working in. For me this was around 60, but I wish I had done more - I had friends that had applied to 150+. You also don't want too many interviews, which will become a problem in later terms. They are time consuming, exhausting, and stressful. So only apply to those that you would actually accept, not just because they sound cool or you've heard of the company before.
4. Method of applying
Avoid your university's job portal if possible, it's probably helpful for your first 1 or 2 jobs but after that it can actually be detrimental. Waterloo for example only lets you "reject" 3 offers - if you get more than that you may be randomly paired to work with a company. If you go against this rule they will kick you off the platform and you could incur penalties. Apply on the companies website directly instead, and if they don't have an internship posting, apply to a full time position anyway. Just be sure to note you're only looking for an internship.
5. Finding companies
Some people don't know what exists and therefore don't even know where to apply. Most know the big names, but a lot of cool startups fly under the radar. Keep up to date with cool founders on LinkedIn/Twitter and companies will be sure to follow. Also check out workatastartup.com and angel.co/.
The three main variables that make choosing between offers hard is:
1. Learning opportunities
2. Clout
3. Benefits
And I believe they should be evaluated in that order, with heavy emphasis on the first 2.
Learning opportunities is how well you'll be able to grow in the field you're interested in, so base this off of your superior's experience and what your job responsibilities are. Keep in mind, you may be able to move around a bit once you accept the job, more often than not startups are more lenient to this, but I've heard of it happening at bigger companies too. For example I have a friend that always joins companies as a mechanical engineer, but always ends up doing software projects on the side. If you're comfortable with being more forward in interviews, try asking the leadership some questions too. This will give you a proxy of what the company culture is like, and how much you might be able to learn. Ali Partovi also gave me a good insight into judging management, think about how you want to learn. If you like to be taught, picking a company with senior management may be better, and if you like to learn on your own, look for management closer to your age (ie. 25-35).
Clout is a factor that blinds a lot of people, and to be fair is likely proportional to your future opportunities, but if you have to sacrifice learning opportunities it could be quite hurtful. For instance, say you have an offer at Google for front end development and another at a startup for full stack. And say you want to have a future in full stack, it may be a better idea to take the startup job now, and wait until Google gives you a full stack offer in a later term. This happened to me with Tesla, it was either I took a Tesla manufacturing job or a design job at Matician, I took the latter in hopes that I would get a design job at Tesla at a later date. And the bet worked out well, plus I had connections to Tesla recruiters that helped me get a design job a couple months later. I always recommend prioritizing learning over clout, especially if you have multiple internship terms like we do at Waterloo, there will always be another opportunity next term. If you can get the job now you can definitely get it next term!
The last factor is pay and benefits, another one that clouds people's judgment. Now there is an exception to this; if you absolutely need the money to pay for expenses (school, rent, etc.), and taking an offer with less compensation would put you in a financially challenging situation, take the higher offer. But if you can manage with less money and it means taking a better job, I would take it every time. And honestly, don't even pay attention to benefits, it's just money disguised as free lunch - and "there ain't no such thing as free lunch".
Let's talk quickly about returning to a previous employer. Let's look at two hypothetical college students Fizz and Buzz. Let's also assume that knowledge accumulation at a company follows a log(t) function, where the learning rate slowly decreases the longer you work at the same place. I believe this is a safe assumption. Fizz thinks that he can learn more by returning to his previous employer. By gaining more and more trust he hopes to eventually be taking on bigger projects, and thus learning more. Buzz believes that he should work at a new company and never return to the same one twice, at least before full time. Over the course of 6 internships and a total of 24 months (standard Waterloo coop program) Fizz realizes that by returning to the same place so many times, he really didn't take advantage of the rapid learning that always happens when brought into a new company culture. After Fizz's first term, he returns to complete the same project he was working on, not learning any new skills. For his third term, he gets a new project and completes it, but since it's still a similar technology to his previous internships, he doesn't learn much more. For his fourth and fifth he takes on a large 8 month project, again not learning much more. Finally for his sixth term he tries a new company and experiences a plethora of new leadership, coworkers, culture, and technology, giving him rapid knowledge accumulation. While Fizz was returning to the same company, Buzz experienced this rapid growth 6 times, ending up with much more knowledge gain. Buzz also has a much broader range of skills and companies to show on his resume, while Fizz just has a large list of projects at the same company. Buzz has 3X the network, 3X more variety, and has probably learned 3X more industry specific knowledge. The two strategies can be seen compared below.

I hope this simple simulation demonstrates why never returning to the same company twice is the best strategy. The only exception I would make is if you want to completely pivot your path (ie. switch from full stack to firmware) and it is easier to do that within the same company since you have a strong internal network. In that scenario, it's basically the same as starting at a new company.
Finally I want to cover the process of choosing between two great offers, which can be extremely stressful. My recommendation is to go through the factors I have outlined above and compare them, weighting learning experiences the most, and benefits the least. I would be lying if I told you I have never made a decision table with all kinds of arbitrary metrics to calculate the optimal job, but let me tell you, this isn't something that can be calculated like everything else in this field - it needs to be felt. What do you feel will give you a better learning experience? Feel free to ask the interviewers questions about what you can learn from them. Prioritize that over the clout and benefits, if you still can't decide, move on to clout. How well known are they? Do they have a strong reputation? If you think all those things are still tied or can't evaluate them, choose the one with better benefits. If you want to do both jobs eventually, ask them both if they would be willing to defer, I'll talk about this next.
If you are thinking of deferring your offer, I have some advice for you. Send a professional email to both companies, asking to defer. Make sure you mention that by deferring you will be better experienced, and that you want to work at both companies desperately. By asking both companies, you keep your options open. See which one is more lenient, and which is more strict. Take the strict one for your next opportunity and then hope the other one allows you to move the offer. Tesla tends to be very lenient, as they're always in demand for interns, Apple on the other hand does not normally do this, and have very strict rules on hiring interns for certain lengths of time. Keep in contact with the employer you intend to defer, even if they don't agree to push back your offer, by staying in touch it will make it much easier to get the offer again at a later time.
Keeping a strong network is crucial for success, so whether you take an offer or not, make sure you keep in touch with recruiters and anyone else involved in your interview process. Add them on LinkedIn, email them quarterly about their hiring needs, or what they are working on, etc. During your internship try to meet as many new people as possible, you would be surprised at how much you can learn just by chatting. Stay in touch with these people too, add them on LinkedIn and your network will grow exponentially.